判断分数是否为无限循环小数
程序员文章站
2022-06-02 20:25:47
...
0.前言
之前做编程题,有一个部分需要判断一个分数是否为无限循环小数,挺有意思,特此整理记录如下:
问题描述(大概意思是)
已知分子a和分母b ,判断 分数a/b是否为无限循环小数
1.已知结论
将分数化为
最简分数
后,分母的全部因数
(除去1和其自身)没有为2或5以外的数,则该分数就不是无限循环小数
;否则为无限循环小数。
首先我们看 1/n的实际含义:将 1 分成n份,每一份的大小
那么10/n的实际含义:将 10 分成n份,每一份的大小
对于将 10 分成n份
这个话题,如果假设每份必须为整数
,那么n的取值(去掉1或者10),只能是2或5
最简分数
是否为无限循环小数
,与分子没有关系。
2.问题解决
2.1求分子分母的最大公约数
此处可用辗转相除法
求最大公约数
2.2 判断最简分数
的分母的因子
此处可直接将分母分别整除以
多次2和5即可
3.代码实现
import java.util.Scanner;
/**
* @Title:InfiniteLoop.java
* @author Stone6762
* @CreationTime 2018年6月12日 下午10:18:39
* @Description: 判断一个分数是否为无限循环小数
*/
public class InfiniteLoop {
/**
* @Title greatestCommonDivisor
* @Describe求最大公约数
* @param a
* @param b
* @return
*/
public static long greatestCommonDivisor(long a, long b) {
long c = 0;
while (true) {// 循环的辗转相除法
c = a % b;
a = b;
b = c;
if (b == 0) {
return a;
}
}
}
/**
* @Title isLoop
* @Describe a/b是否为无限循环小数
* @param a分子
* @param b分母
* @return
*/
public static boolean isLoop(long a, long b) {
// 1.化简,分子分母同时除以最大公约数
long commonDivisor = greatestCommonDivisor(a, b);
b = b / commonDivisor;
// 2.判断分母是否为2的次幂,5的次幂,或者2 5结合
// 首先让其除以2的次幂
while (b % 2 == 0) {
b /= 2;
}
// 然后让其除以5的次幂
while (b % 5 == 0) {
b /= 5;
}
// 最后判断是否为1,如果为1 说明没有 2或者5或者2和5结合构成 以外的因子
if (b == 1) {
return false;
} else {
return true;
}
}
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
while (scan.hasNext()) {
int a = scan.nextInt();
int b = scan.nextInt();
System.out.println( a+"/"+b+"的结果是否为无限循环小数: " + isLoop(a, b));
}
}
}