求无限循环小数的循环节长度

新手的代码
思路:
求出小数的小数部分,需要一定的长度,可以将其保存在数组中
将数组分为最长 length/2 部分,一一进行比较判断是否是循环节并求出循环节长度

package edu.ecut;

public class ArrayTest {
    public static void main(String[] args) {
        int length = 1000;
        int second = 6;
        int first = 1;
        ArrayTest obj = new ArrayTest();

        int[] array = obj.getArray(first, second, length);
        obj.print(array);

        System.out.println(obj.getRepeatLength(array));

    }

    private int getRepeatLength(int[] array) {
        int length = -1;
        for (int i = 1; i < array.length / 2; i++) {
            length = i;
            if (isRepeat(array, length)) {
                int[] repetend = getRight(array, length);
                //判断循环节中的数字是否都一样
                if (isOnlyOne(repetend)) {
                    return 1;
                }

                return length;
            }
        }
        return length;
    }

    private boolean isOnlyOne(int[] repetend) {
        for (int i = 0; i < repetend.length - 1; i++) {
            int temp = repetend[i];
            if(temp != repetend[i + 1]){
                return false;
            }
        }
        return true;
    }

    private boolean isRepeat(int[] array, int length) {
        int[] source = getRight(array, length);

        for (int i = 1; i < array.length / length; i++) {
            int[] dest = getRight(array, length, array.length - 1 - i * length);
            if (!compare(source, dest)) {
                return false;
            }
        }

        return true;
    }

    private boolean compare(int[] source, int[] dest) {

        for (int i = 0; i < dest.length; i++) {
            if (dest[i] != source[i]) {
                return false;
            }
        }

        return true;
    }

    private int[] getRight(int[] array, int length) {
        int[] result = new int[length];
        for (int i = 0; i < result.length; i++) {
            result[i] = array[array.length - 1 - i];
        }
        return result;
    }

    private int[] getRight(int[] array, int length, int startIndex) {
        int[] result = new int[length];
        for (int i = 0; i < result.length; i++) {
            result[i] = array[startIndex - i];
        }
        return result;
    }

    private void print(int[] array) {
        for (int i = 0; i < array.length; i++) {
            System.out.print(array[i] + " ");
        }
        System.out.println();
    }

    private int[] getArray(int first, int second, int length) {
        int[] array = new int[length];

        //将假分数化为真分数
        while (first > second) {
            first -= second;
        }

        //求两数相除的小数部分
        for (int i = 0; i < array.length; i++) {
            first *= 10;
            array[i] = first / second;
            first %= second;
        }
        return array;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值