基础算法题——欧几里得

基础算法题——欧几里得

本人为一名普通二本学校自动化专业的大二学生,对编程有着少许兴趣。致力将算法写得更加通俗易懂。

做题心得

该算法题考查的是对欧几里得算法和斐波那契数列的理解。
我遇到过很多与欧几里得算法有关的算法题,但是依旧对欧几里得算法不太理解。本次就通过讲解的形式,加深自己对欧几里得算法的理解。若有不恰当的地方,欢迎评论。

欧几里得题目

题目输入与输出
示例及备注
牛客网题目链接

题目分析

题目中要求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的值。
如果对本题有其他看法的话,欢迎老铁给小郑留言。

如果觉得该文章对你有用的话,可以给我一个大大的赞喔!!

老铁的关注是鼓励我写博客的最大动力~

被代码吃了

发布了10 篇原创文章 · 获赞 9 · 访问量 434

猜你喜欢

转载自blog.csdn.net/Zhengyangxinn/article/details/104276054