From:https://leetcode.com/problems/fraction-to-recurring-decimal/#
Given two integers representing the numerator and denominator of a fraction, return the fraction in string format.
If the fractional part is repeating, enclose the repeating part in parentheses.
For example,
- Given numerator = 1, denominator = 2, return "0.5".
- Given numerator = 2, denominator = 1, return "2".
- Given numerator = 2, denominator = 3, return "0.(6)".
class Solution {
public:
string fractionToDecimal(int numerator, int denominator) {
if (numerator == 0) return "0";
if (denominator == 0) return "";
string ans = "";
if ((numerator < 0) ^ (denominator < 0)) ans += "-"; //如果结果为负数
long long int num = numerator, den = denominator; //转正
num = abs(num);
den = abs(den);
//整数部分
ans += to_string(num / den);
long long int rem = num % den;
if (rem == 0) return ans; //如果能够整除,返回结果
//小数部分
map<long long, int> mp;
ans += ".";
while (rem != 0) {
//如果前面已经出现过该余数,那么将会开始循环
if (mp.find(rem) != mp.end()) {
int start = mp[rem]; //循环体开始的位置
string part1 = ans.substr(0, start);
string part2 = ans.substr(start, ans.length());
ans = part1 + "(" + part2 + ")";
return ans;
}
mp[rem] = ans.length();
rem *= 10;
ans += to_string(rem/den);
rem = rem % den;
}
return ans;
}
};
public class Solution {
public String fractionToDecimal(int numerator, int denominator) {
if (denominator == 0) {
return "";
}
if (numerator == 0) {
return "0";
}
StringBuilder ans = new StringBuilder();
if ((numerator < 0) ^ (denominator < 0)) {
ans.append('-'); //如果结果为负数
}
long num = numerator, den = denominator; //转正
num = Math.abs(num);
den = Math.abs(den);
//整数部分
ans.append(String.valueOf(num / den));
long rem = num % den;
if (rem == 0) {
return ans.toString(); //如果能够整除,返回结果
}
//小数部分
Map<Long, Integer> mp = new HashMap<Long, Integer>();
ans.append('.');
while (rem != 0) {
//如果前面已经出现过该余数,那么将会开始循环
if (mp.containsKey(rem)) {
int index = mp.get(rem); //循环体开始的位置
String part1 = ans.substring(0, index);
String part2 = ans.substring(index);
return part1 + "(" + part2 + ")";
}
mp.put(rem, ans.length());
rem *= 10;
ans.append(rem/den);
rem = rem % den;
}
return ans.toString();
}
}