Problem Description
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)”.
[https://leetcode.com/problems/fraction-to-recurring-decimal/]
思路
用Map保存每次除剩下的余数和ans的长度,这样如果出现相同的余数,说明到了循环的起点。。
Code
package q166;
import java.util.HashMap;
import java.util.Map;
public class Solution {
public String fractionToDecimal(int numerator, int denominator) {
String ans = "";
int symbol = 1;
long mydenominator=(long)denominator;
long mynumerator=(long)numerator;
if (mynumerator < 0) {
symbol *= -1;
mynumerator *= -1;
}
if (mydenominator < 0) {
symbol *= -1;
mydenominator *= -1;
}
if (symbol < 0&&mynumerator>0)
ans += "-";
if (mynumerator / mydenominator > 0)
ans += mynumerator / mydenominator + "";
else if(mynumerator / mydenominator==0) ans += "0";
if (mynumerator % mydenominator == 0)
return ans;
else {
ans += ".";
int i = 0;
long a = mynumerator;
Map<Long,Integer> m=new HashMap<Long,Integer>();
a -= (Math.ceil(a / mydenominator)) * mydenominator;
m.put(a, ans.length());
while (i++ < 3000&&a!=0) {
a *= 10;
if(a / mydenominator<0) ans += -a / mydenominator;
else ans += a / mydenominator;
a -= (Math.ceil(a / mydenominator)) * mydenominator;
if(m.containsKey(a)){
ans=ans.substring(0,m.get(a))+"("+ans.substring(m.get(a))+")";
break;
}else{
m.put(a, ans.length());
}
}
}
return ans;
}
//
// public static void main(String[] args) {
// Solution s = new Solution();
// System.out.println(s.fractionToDecimal(-2147483648,-1));
// }
}