欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

判断分数是否为无限循环小数

程序员文章站 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));
        }
    }
}

判断分数是否为无限循环小数