目录
分数到小数
给定两个整数,分别表示分数的分子 numerator 和分母 denominator,以 字符串形式返回小数 。
如果小数部分为循环小数,则将循环的部分括在括号内。
如果存在多个答案,只需返回 任意一个 。
对于所有给定的输入,保证 答案字符串的长度小于 104 。
示例 1:
输入:numerator = 1, denominator = 2
输出:"0.5"
示例 2:输入:numerator = 2, denominator = 1
输出:"2"
示例 3:输入:numerator = 4, denominator = 333
输出:"0.(012)"
提示:
-231 <= numerator, denominator <= 231 - 1
denominator != 0
题解:
首先,需要将分子、分母转化为long,因为分子可能 ∗10导致溢出int的数据范围。
问题拆解:
- 计算小数的正负号。
- 计算小数的小数点前的整数。
- 计算小数的小数点后的有限小数 或者 无限循环小数。
★计算小数的小数点后小数:
- 模拟除法运算,即分子∗10然后 分子/ 分母。注意整除的情况,即没有小数点后的数字。
- 有限小数,会出现 分子/分母 整除的情况。
- 无限循环小数,会出现 分子/分母 的余数等于之前的一步的分子。
代码:
class Solution { public String fractionToDecimal(int numerator, int denominator) { long a=numerator; long b=denominator; if(a==0) return "0"; //存储结果 StringBuilder sb=new StringBuilder(); //判断正负号 if((a<0&&b>0)||(a>0&&b<0)){ sb.append("-"); a= a<0 ? -a : a; b=b<0 ? -b : b; } long res1=a/b; //判断有没有小数部分 long temp=a%b; if(temp==0){ sb.append(res1); return sb.toString(); }else{ sb.append(res1); sb.append('.'); long res2[]=new long[10001]; long temp2[]=new long[10001]; int i=0; int k=-1; while(temp!=0){ temp*=10; res2[i]=temp/b; temp2[i]=temp%b; temp=temp2[i]; if(temp!=0&&i!=0){ for(int j=0;j<i;j++){ //相等说明找到了循环体位置,标注一下 if(res2[j]==res2[i]&&temp2[j]==temp){ k=j; break; } } } if(k!=-1){ break; } i++; } if(k==-1){ for(int j=0;j<i;j++) { sb.append(res2[j]); } }else{ for(int j=0;j<i;j++) { if(j==k){ sb.append('('); } sb.append(res2[j]); } sb.append(')'); } return sb.toString(); } } }