给定两个整数,分别表示分数的分子 numerator 和分母 denominator,以字符串形式返回小数。
如果小数部分为循环小数,则将循环的部分括在括号内。
示例 1:
输入: numerator = 1, denominator = 2
输出: "0.5"
示例 2:
输入: numerator = 2, denominator = 1
输出: "2"
示例 3:
输入: numerator = 2, denominator = 3
输出: "0.(6)"
思路:结果有三种,分别为整数、有限小数、有限循环小数。
对于前两种,可以通过判断余数是否为0的方法来求解。对于后者,可以采用容器的方法来存储所有余数,本题使用map容器,第一个数为余数值,第二个数为第几个余数(用于在循环处插入括号)。
代码:
//166 string fractionToDecimal(int numerator, int denominator) { if(numerator==0) return "0"; short s1 = numerator<0?-1:1; short s2 = denominator<0?-1:1; long long n1 = abs((long long)numerator); long long n2 = abs((long long)denominator); long long num = n1>=n2?n1/n2:0; long long d = n1%n2; string result = to_string(num); if(s1*s2<0) result ="-" + result; if(d==0) return result; //整数商 string temp; map<int,int> m; int i=0; while(d!=0 && m.find(d)==m.end()) { m[d] = i++; d *=10; temp += (d/n2+‘0‘); d = d%n2; } if(d==0) return result = result+"."+ temp;//可除尽分数 temp = temp.insert(m[d],"("); temp +=")"; result = result +"." + temp ;//循环分数 return result; }//166
说明:本系统为windows x64,IDE为 Qt 的 mingw 32,发现 int 和 long的字节长度一样,long long 类型才是 int 的两倍长度。经过查资料,最后得知 int 会根据系统自动变化,实际为int64_
原文:https://www.cnblogs.com/2Bthebest1/p/11078278.html