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

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));
        }
    }
}

猜你喜欢

转载自blog.csdn.net/u011446177/article/details/80672336