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里面取商。
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(); }
相关文章推荐
- Quartz定时任务
- ListView分页加载数据
- 代码注释主要有哪几种
- 40条常见的移动端Web页面问题解决方案
- C 与 JAVA 的对比分析
- 2008年北大核心有效期 计算机类核心(2011-01-31 15:02:46)
- osgEarth2.7+vs2010+win7编译方法
- 大数相加
- R语言笔记一
- 解决Matlab画图直接保存.eps格式而导致图不全的问题
- java中的synchronized实例(代码块)
- osgOcean+VS2010+Win7编译方法
- html和css基础知识
- BeautifulSoup 的用法
- string char * const char *之间的互相转换
- Java编程思想学习笔记之构造器
- 回答bestswifter的BAT面试问题
- python List排序问题
- 165. Compare Version Numbers
- Shell 脚本知识回顾 (一) —— 基础篇