分数到小数
给定两个整数,分别表示分数的分子 numerator 和分母 denominator,以字符串形式返回小数。
如果小数部分为循环小数,则将循环的部分括在括号内。
示例 1:
输入: numerator = 1, denominator = 2
输出: "0.5"
思路+代码+注释:
public String fractionToDecimal(int numerator, int denominator) {
/*
思路:首先求两个数的商、余数,如果余数为0,直接返回商即可。如果余数不为0,那么使用余数*10/被除数,得到一位小数位的数字,
新余数=余数*10%被除数,使用一个List记录所有小数位的数字,如果余数为0那么结果就出来了退出循环,拼接小数数字,如果余数不为0,
那么继续计算,使用一个hashMap记录每个余数以及出现的位置,当hashMap中某个余数存在时,说明出现了循环,在该余数第一出现的位置前
加{在集合的最后加}退出循环
*/
if (denominator==0)
{
return "";
}
HashMap<Long,Integer> map=new HashMap<>();
boolean flag=false;
if ((numerator>0 && denominator<0) || (numerator<0 && denominator>0))
{
flag=true;
}
long numOne=Math.abs((long)numerator);
long numTwo=Math.abs((long)denominator);
long shang=numOne/numTwo;
long yu=numOne%numTwo;
StringBuilder res=new StringBuilder();
if (flag)
{
res.append("-"+shang);
}else {
res.append(shang);
}
if (yu==0)
{
return res.toString();
}
res.append(".");
List<String> xiaoShu=new ArrayList<>();
int pos=0;
while (yu!=0)
{
if (map.containsKey(yu))
{
int leftIndex=map.get(yu);
xiaoShu.add(leftIndex,"(");
xiaoShu.add(")");
break;
}else {
shang=yu*10/numTwo;
map.put(yu,pos);
xiaoShu.add(shang+"");
yu=yu*10%numTwo;
pos++;
}
}
for (int i = 0; i < xiaoShu.size(); i++) {
res.append(xiaoShu.get(i));
}
return res.toString();
}