java黑皮书22.6----(GCD的执行时间)

问题描述

提示:这道题其实就是对书上算法的实现与理解:

将书上程序清单实现一遍之后再输出就好


难点分析:

提示:这里需要先求Fibonacci数列之后求其相邻两个的最大公约就好了:

其实这道题就是将书上的代码实现一下就好,但是这值得说的是,其实斐波那契数列相邻的两个数是互质的,最大公约数就是1,这道题其实在数学上有,这里相当于有程序证明了这个结论。

public static int[] Fb(int num) {
        int[] fb = new int[num];
        int f0 = 0;
        int f1 = 1;
        int f2 = 1;
        for (int i = 0; i < num; i++) {
            if (i == 0) {
                fb[i] = i;
            } else if (i == 1) {
                fb[i] = i;
            } else {
                fb[i] = fb[i - 1] + fb[i - 2];
            }
        }
        return fb;
    }

    public static int gcd1(int m, int n) {
        int gcd = 1;

        if (m % n == 0) return n;

        for (int k = n / 2; k >= 1; k--) {
            if (m % k == 0 && n % k == 0) {
                gcd = k;
                break;
            }
        }

        return gcd;
    }

    public static int gcd2(int m, int n) {
        if (m % n == 0)
            return n;
        else
            return gcd2(n, m % n);
    }

代码:

提示:这个代码也有很多可以简化的地方

public class Lab22_6 {
    public static void main(String[] args) {
        int[] temp = Fb(47);
        long startTime;
        long endTime;
        System.out.println("                      | 40\t41\t42\t43\t44\t45");
        System.out.println("-----------------------------------------------------------");

        System.out.print("程序清单22-3 GCD       |");
        for (int i = 40; i < 46; i++) {
            startTime = System.currentTimeMillis();
            gcd1(temp[i], temp[i + 1]);
            endTime = System.currentTimeMillis();
            System.out.print("\t" + (endTime - startTime));
        }
        System.out.println();

        System.out.print("程序清单22-4 GCDEuclid |");
        for (int i = 40; i < 46; i++) {
            startTime = System.currentTimeMillis();
            gcd2(temp[i], temp[i + 1]);
            endTime = System.currentTimeMillis();
            System.out.print("\t" + (endTime - startTime));
        }
        System.out.println();
    }

    public static int[] Fb(int num) {
        int[] fb = new int[num];
        int f0 = 0;
        int f1 = 1;
        int f2 = 1;
        for (int i = 0; i < num; i++) {
            if (i == 0) {
                fb[i] = i;
            } else if (i == 1) {
                fb[i] = i;
            } else {
                fb[i] = fb[i - 1] + fb[i - 2];
            }
        }
        return fb;
    }

    public static int gcd1(int m, int n) {
        int gcd = 1;

        if (m % n == 0) return n;

        for (int k = n / 2; k >= 1; k--) {
            if (m % k == 0 && n % k == 0) {
                gcd = k;
                break;
            }
        }

        return gcd;
    }

    public static int gcd2(int m, int n) {
        if (m % n == 0)
            return n;
        else
            return gcd2(n, m % n);
    }
}

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值