您的位置:首页 > 其它

166. Fraction to Recurring Decimal

2016-06-19 21:45 288 查看
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)".

把分数表示成一个小数,小数可能是循环小数,循环小数要找出循环节。
例如 1/222=0.0(045)。从最基本的出发,求小数就是不断除法,有余数添0继续除。
看看这个例子的过程吧
商0余1
商0余10
商0余100
商4余112
商5余10
商0余100
看,出现和前面相同的商+余数的组合,处于这段之间的,就是循环小数的循环部分了。
每一对商和余数组成一个hash塞入hashset,也塞入hasharr方便到时候查找,用Arraylist记录商的路径。
每当出现重复的商-余组合时在hasharr中搜索其index就能得到循环节的长度,再回Arraylist里面取商。
public static String fractionToDecimal(int numerator, int denominator)
{
if(numerator==0)
return "0";
int sign=(numerator>>31)^(denominator>>31);
long lnumerator=numerator>=0?numerator:-(long)numerator;
long ldenominator=denominator>=0?denominator:-(long)denominator;
long quotient=lnumerator/ldenominator;
long remainder=lnumerator%ldenominator;
if(remainder==0)
return sign!=0?"-"+String.valueOf(quotient):String.valueOf(quotient);

HashSet<Long> hashset=new HashSet<>(128);
StringBuilder sb=new StringBuilder();
ArrayList<Integer> arraylist=new ArrayList<>(128);
ArrayList<Long> hasharr=new ArrayList<>(128);
boolean circle=false;
sb.append(quotient);
sb.append('.');
lnumerator=remainder*10;
long hash=-1;

while(remainder!=0)
{
quotient=lnumerator/ldenominator;
remainder=lnumerator%ldenominator;
hash=quotient*7+remainder*10007;
if(!hashset.contains(hash))
{
hashset.add(hash);
hasharr.add(hash);
arraylist.add((int) quotient);
}
else
{
circle=true;
break;
}
sb.append(quotient);
lnumerator=remainder*10;
}

if(circle)
{
int index=hasharr.indexOf(hash);
int len=hasharr.size()-index;
sb.delete(sb.length()-len, sb.length());
sb.append('(');
for(int i=index;i<arraylist.size();i++)
sb.append(arraylist.get(i));
sb.append(')');
}
if(sign!=0)
sb.insert(0, '-');

return sb.toString();
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: