算法思路
- 定理:一个分母为N的循环小数的循环节位数最多不超过N-1位
- 若A/B为无限循环小数的话,则在出现循环节之前,每次长除法的余数都不相同
代码
/**
* @param a 分子
* @param b 分母
* @return 返回代表循环节的字符串
*/
static String getRepetend(int a,int b){
String decimal ="";
List<Integer> temp = new LinkedList<Integer>();
a = a%b;
loop:
while(a!=0){
if(!temp.contains(a)) temp.add(a);
else
for(int i=0;i<temp.size();i++)
if(temp.get(i)==a) {
decimal = decimal.substring(i,decimal.length());
break loop;
}
decimal += a*10/b;
a = (a*10)%b;
}
return decimal;
}
算法例子
参考:https://programtip.com/zh/art-111488
给定分子a,分母b,若a除以b为无限循环小数,则输出格式为整数部分.小数部分[循环节]
,例如1.03333333
输出格式为1.0[3]
,若是有限小数,则输出不带后缀零的结果,例如1.25
输出格式为1.25
代码
import java.util.LinkedList;
import java.util.List;
public class test {
static String getResult(int a,int b){
if(a%b==0) return String.valueOf(a/b);
String decimal ="";
List<Integer> temp = new LinkedList<Integer>();
a = a%b;
loop:
while(a!=0){
if(!temp.contains(a)) temp.add(a);
else
for(int i=0;i<temp.size();i++)
if(temp.get(i)==a) {
decimal = decimal.substring(0,i)+"["+decimal.substring(i,decimal.length())+"]";
break loop;
}
decimal += a*10/b;
a = (a*10)%b;
}
return String.valueOf(a/b)+"."+decimal;
}
public static void main(String[] args) {
for(int i=1; i<=20; i++)
System.out.println(getResult(1,i));
}
}
结果
1
0.5
0.[3]
0.25
0.2
0.1[6]
0.[142857]
0.125
0.[1]
0.1
0.[09]
0.08[3]
0.[076923]
0.0[714285]
0.0[6]
0.0625
0.[0588235294117647]
0.0[5]
0.[052631578947368421]
0.05