E 斐波那契数列最大公约数
本题总分:15 分
问题描述
答案提交
这是一道结果填空题,你只需要算出结果后提交即可。本题的结果为一个
整数,在提交答案时只填写这个整数,填写多余的内容将无法得分
解法:
1.辗转相除法(欧几里德法) C语言中用于计算两个正整数a,b的最大公约数,采用函数嵌套调用形式进行求两个数的最大公约数。其算法过程为:
前提:设两数为a,b设其中a做被除数,b做除数,temp为余数
Steps:
1.大数放a中,小数放b中;
2.求a/b的余数;
3.若temp=0则b为最大公约数;
4.如果temp!=0则把b的值给a,temp的值给a;
返回第二步。
答案:6765
import java.math.BigInteger;
/*思路一
(1)先用dp算出 F2020 和 F520
(2)用BigInteger自带的函数gcd求解最大公约数
*/
public class 试题E_斐波那契数列最大公约数 {
public static void main(String[] args) {
// TODO Auto-generated method stub
//long型会导致溢出,采用bigInteger;
BigInteger[] dp=new BigInteger[2021];
dp[1]=BigInteger.ONE;
dp[2]=BigInteger.ONE;
for(int i=3;i<2021;i++) {
dp[i]=dp[i-1].add(dp[i-2]);
}
System.out.println(dp[2020]);
System.out.println(dp[520]);
BigInteger gcd = gcd(dp[2020], dp[520]);
System.out.println(gcd);
}
public static BigInteger gcd(BigInteger a,BigInteger b) {
//1.递归出口
if(b.equals(BigInteger.ZERO)) {
return a;
}
//2.递推
return gcd(b,a.mod(b));
}
}