Giả sử chúng ta có hai số nguyên biểu thị tử số và mẫu số của một phân số, chúng ta phải tìm phân số ở dạng chuỗi. Nếu phần phân số đang lặp lại, hãy đặt phần lặp lại trong dấu ngoặc đơn. Vì vậy, nếu tử số là 2 và mẫu số là 3, thì kết quả đầu ra sẽ là “0. (6)”
Để giải quyết vấn đề này, chúng tôi sẽ làm theo các bước sau -
-
nếu tử số là 0, thì trả về 0
-
xác định ans một mảng
-
nếu tử số <0 và mẫu số> 0 hoặc tử số 0 và mẫu số <0, thì chèn ký hiệu âm ‘-’ vào mảng ans
-
số chia:=| tử số | và cổ tức:=| consminator |, còn lại:=divisor mod cổ tức
-
x:=chuỗi số bị chia / số cổ tức
-
chèn từng ký tự từ x vào mảng ans
-
nếu remainder =0, thì trả về mảng ans dưới dạng chuỗi.
-
chèn dấu chấm ‘.’ vào ans
-
xác định một bản đồ m
-
trong khi phần còn lại không phải là 0
-
nếu phần còn lại là m, thì
-
chèn các dấu ngoặc đơn đang mở ở chỉ mục m [phần còn lại] của ans
-
chèn dấu ngoặc đơn đóng vào dấu ans ở cuối
-
phá vỡ vòng lặp
-
-
nếu không thì
-
m [phần còn lại]:=kích thước của ans
-
phần còn lại:=phần còn lại * 10
-
chèn (phần còn lại / cổ tức) dưới dạng ký tự vào ans
-
remainder:=còn lại mod cổ tức
-
-
-
trả về mảng ans dưới dạng chuỗi.
Hãy cùng chúng tôi xem cách triển khai sau để hiểu rõ hơn -
Ví dụ
#include <bits/stdc++.h>
using namespace std;
class Solution {
public:
string fractionToDecimal(int numerator, int denominator) {
if(numerator == 0)return "0";
vector <char> ans;
if(numerator < 0 && denominator > 0 || numerator > 0 && denominator < 0)ans.push_back('-');
long divisor = labs(numerator);
long dividend = labs(denominator);
long remainder = divisor % dividend;
string x = to_string(divisor/dividend);
for(int i = 0; i < x.size(); i++){
ans.push_back(x[i]);
}
if(remainder == 0){
return string(ans.begin(), ans.end());
}
ans.push_back('.');
map <int, int> m;
while(remainder != 0){
if(m.find(remainder)!=m.end()){
ans.insert(ans.begin() + m[remainder], '(');
ans.push_back(')');
break;
}else{
m[remainder] = ans.size();
remainder *= 10;
ans.push_back((remainder / dividend) + '0');
remainder %= dividend;
}
}
return string(ans.begin(), ans.end());
}
};
main(){
Solution ob;
cout << ((ob.fractionToDecimal(100,6)));
} Đầu vào
100 6
Đầu ra
16.(6)