题目
给定两个整数,分别表示分数的分子 numerator 和分母 denominator,以字符串形式返回小数。
如果小数部分为循环小数,则将循环的部分括在括号内。
示例 1:
输入: numerator = 1, denominator = 2
输出: "0.5"
示例 2:
输入: numerator = 2, denominator = 1
输出: "2"
示例 3:
输入: numerator = 2, denominator = 3
输出: "0.(6)"
思路
需要知道的是,两个整数相除,结果只有两种可能:有限循环小数和无限循环小数,不可能出现无限不循环小数。
可以先考虑被除数和除数都为正的情况,最后根据被除数和除数是否符号相同再决定结果是否添加负号。
模拟除法过程。
余数后补0(x10)继续除法。注意余数重复出现的时候就是需要无限循环的时候。
代码
class Solution {
public String fractionToDecimal(int numerator, int denominator) {
//a表示分子的绝对值,防止溢出情况(分子为 -(2的31次方)) 使用long类型
long a=0;
if(numerator>=0){
a=numerator;
}else{
//防止溢出情况,先转换为long类型再加‘-’
a=-(long)numerator;
}
//b表示分母的绝对值,防止溢出情况(分母为 -(2的31次方)) 使用long类型
long b=0;
if(denominator>0){
b=denominator;
}else {
//防止溢出情况,先转换为long类型再加‘-’
b=-(long)denominator;
}
String res="";
// 同样使用long类型
long shang=a/b;
long yushu=a%b;
if(yushu==0){
res+=shang+"";
}else{
res+=shang+".";
// list存放所有余数(被除数)列表
List<Long> l=new ArrayList<Long>();
l.add(yushu);
// 进行小数点之后的计算
res+=xiaoshuchufa(yushu,b,"",l);
}
// 结果是否为负数
if(numerator>0 && denominator<0 || numerator<0 && denominator>0){
res="-"+res;
}
return res;
}
public static String xiaoshuchufa(long a, long b, String res, List<Long> l){
a=a*10;
long shang=a/b;
long yushu=a%b;
if(yushu==0){
res+=shang;
return res;
}else{
res+=shang;
//余数重复情况,意味着出现无限循环的情况
if(l.contains(yushu)){
res+=")";
//找到重复余数之前所在的位置添加"("
for(int i=0;i<l.size();i++){
if(l.get(i)==yushu){
res=res.substring(0,i)+"("+res.substring(i);
break;
}
}
return res;
}else{
l.add(yushu);
return xiaoshuchufa(yushu,b,res,l);
}
}
}
}
注意
1.模拟除法过程
2.int溢出使用long,先转换为long类型再加 ‘-’