题目描述
对于Fibonacci数列:1,1,2,3,5,8,13......大家应该很熟悉吧~~~但是现在有一个很“简单”问题:第n项和第m项的最大公约数是多少?
Update:加入了一组数据。
输入输出格式
输入格式:
两个正整数n和m。(n,m<=10^9)
注意:数据很大
输出格式:
Fn和Fm的最大公约数。
由于看了大数字就头晕,所以只要输出最后的8位数字就可以了。
输入输出样例
输入样例#1: 复制
4 7
输出样例#1: 复制
1
说明
用递归&递推会超时
用通项公式也会超时
注意::公式:gcd(f(n),f(m))=f(gcd(n,m))------------很重要
public class _05斐波那契数列求最大公约数 {
// 公式:gcd(f(n),f(m)) = f(gcd(m,n))
public static void main(String[] args) {
int m = 2020, n = 520;
int res = Ou(m,n);
System.out.println(res);
System.out.println(Max_min(m,n));
// 1 1 2 3 5 8 13
System.out.println(fib(res));
}
/**
*
* @Title: Ou
* @Description: 求两个数的最大公约数
* @param @param n
* @param @param m 参数
* @return void 返回类型
* @throws
*/
public static int Ou(int n,int m) {//最大公约数
int min = 0;
int res = 1;
min = (n < m ? n: m);
for(int i = min; i > 1; i--) {
if(n % i == 0 && m % i==0) {
res = i;
break;
}
}
return res;
}
// 求最大公约数和最小公倍数
public static int Max_min(int a, int b) {
int i = a;
int j = b;
int x = 0, y = 0;
if ( a < b) {
x = b;
b = a;
a = x; // a是较大的值
}
while(b!=0) {
y = a % b;
a = b;
b = y;
}
int t = i * j / a; // 最小公倍数
return a;
}
// 递归求斐波那契数列
public static int fib(int n) {
if(n == 1 || n == 2) { return 1; }
return fib(n-1) + fib(n-2);
}
}