基础算法题——欧几里得
本人为一名普通二本学校自动化专业的大二学生,对编程有着少许兴趣。致力将算法写得更加通俗易懂。
做题心得
该算法题考查的是对欧几里得算法和斐波那契数列的理解。
我遇到过很多与欧几里得算法有关的算法题,但是依旧对欧几里得算法不太理解。本次就通过讲解的形式,加深自己对欧几里得算法的理解。若有不恰当的地方,欢迎评论。
欧几里得题目
题目分析
题目中要求a>b>=0且a+b最小的一组的a与b之和,并已知gcd(a,b)共递归了n次。
按照小郑的逻辑里,应该是先知道a,b的值,再求出递归次数n,但题目却与我的想法完全相反。不过题目条件要求a+b要为最小,提示我们可以用斐波那契数列。
欧几里得算法
欧几里得算法又叫辗转相除法,可以求出两个正整数a,b的最大公约数。
//c语言实现欧几里得算法
int gcd(int a, int b)
{
if(b==0)
return 0;
return gcd(b,a%b);
}
斐波那契数列
斐波那契数列又称黄金分割数列、兔子数列。
指的是这样一个数列:1、1、2、3、5、8、13、21…在数学上,斐波那契数列以如下被递推的方法定义:F(1)=1,F(2)=1,F(n)=F(n-1)+F(n-2)其中的n>=3。
欧几里得算法与斐波那契数列结合
通过对斐波那契数列和欧几里得算法的理解,我们可以得到在斐波那契数列中,相邻两个数的最大公约数为1,而F(n)=F(n-1)+F(n-2)也符合题目特点:a+b最小。
示例分析
在示例1中,输入n=0,输出a+b=1。gcd(1,0)递归0次
在示例2中,输入n=1,输出a+b=3。gcd(2,1)递归1次
根据本题示例,我们可以推断:输入gcd(a,b)递归次数n,输出斐波那契数列F(n+1)。
最后附上算法代码:
//因为C语言的特点
//Fib[0]=F(2)
//Fib[1]=F(3)
#include<stdio.h>
int main(){
int i, Fib[100], T, n;
Fib[0]=1;
Fib[1]=2;
for(i=2; i<100; i++){
Fib[i]=Fib[i-1]+Fib[i-2];
}
scanf("%d", &T);
while(T--){
scanf("%d", &n);
printf("%d", Fib[n]);
}
return 0;
}
总结
该题主要考查了对欧几里得算法、斐波那契数列的理解。只要明白欧几里得算法中的a,b,若取自于斐波那契数列(已知递归次数n,a+b最小),则可以通过n带入斐波那契数列中,得到a+b的值。
如果对本题有其他看法的话,欢迎老铁给小郑留言。