问题描述
提示:这道题其实就是对书上算法的实现与理解:
将书上程序清单实现一遍之后再输出就好
难点分析:
提示:这里需要先求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);
}
}