初夏小谈:斐波那契三种实现方法(C语言版)(第三种相信你没见过)

斐波那契数列(Fibonaccisequnce),又称黄金分割数列。研究斐波那契数列有相当重要的价值,例在现代物理、准晶体结构、化学等领域都有直接的应用。因此研究斐波那契数列也是很有必要的。

今天初夏将为大家带来计算斐波那契数列第n位的三种方法

第一种利用递归的方法计算,代码相当简单,但其重复计算率太高,导致其时间复杂度比指数还要爆炸式增长。不推荐此方法。但递归的思想却相当的重要还是要理解并掌握。

#include<Aventador_SQ.h>

int  Fibonacci(int n)
{
	if (1 == n|| 2 == n)
	{
		return 1;
	}
	else
	{
		return Fibonacci(n - 1) + Fibonacci(n - 2);
	}
}
int main()
{
	int n = 0;//求取第n个数
	int	a = 0;//所求的数
	scanf("%d", &n);
	a=Fibonacci(n);
	printf("第%d个数是%d\n",n,a);
	system("pause");
	return 0;
}

第二种是利用循环的方法,借助三个变量进行交换。其时间复杂度是O(n)

#include<Aventador_SQ.h>

void Fibonacci(int x)
{
	if (x < 1)
	{
		printf("输入错误!!!\n");
	}
	else if (x < 3)
	{
		printf("第%d个数是1\n", x );
	}
	else
	{
		int FiboOne = 1;
		int FiboTwo = 1;
		int FiboN = 0;
		int i=0;
		for (i = 3; i <= x; i++)
		{
			FiboN = FiboOne + FiboTwo;
			FiboOne = FiboTwo;
			FiboTwo = FiboN;
			//printf("%d\t%d\n", i, FiboN);
		}
		printf("第%d个数是%d\n", x, FiboN);
	}
}
int main()
{
	int n;
	scanf("%d", &n);
	Fibonacci(n);
	system("pause");
	return 0;
}

第三种到了最伤脑子的算法即矩阵,但运行速度大大提高。

#include<Aventador_SQ.h>

void Fibonacci(int x)
{
	int FFiboZero = 0, FiboZero = 0;
	int FFiboOne = 1, FiboOne = 1;
	int FFiboTwo = 1, FiboTwo = 1;
	int FiboN = 0;

	int i = 0;
	for (i = 2; i <= (x / 2); i++)
	{
		FiboN = FFiboTwo * FiboTwo + FFiboOne * FiboOne;//利用矩阵求出待求得数字
		//进行交换达到移动中间变量
		FFiboZero = FFiboOne;
		FFiboOne = FFiboTwo;
		FFiboTwo = FiboN;
	}
	FiboN = FFiboTwo * FFiboTwo + FFiboOne * FFiboOne;//得到最终的所求取得数
	printf("%d\t%d\n", x, FiboN);
}

void JFibonacci(int x)
{
	int FFiboZero = 0, FiboZero = 0;
	int FFiboOne = 1, FiboOne = 1;
	int FFiboTwo = 1, FiboTwo = 1;
	int FiboN = 0;

	int i = 0;
	for (i = 2; i <= ((x - 1) / 2); i++)
	{
		FiboN = FFiboTwo * FiboTwo + FFiboOne * FiboOne;
		FFiboZero = FFiboOne;
		FFiboOne = FFiboTwo;
		FFiboTwo = FiboN;
	}
	//当所求的位数是奇数时要另外计算第三种情况
	FiboN = FFiboTwo * FFiboTwo + FFiboOne * FFiboOne;
	FFiboTwo = FFiboTwo * FFiboOne + FFiboOne * FFiboZero;
	FiboN = FiboN * FiboTwo + FFiboTwo * FiboOne;
	printf("%d\t%d\n", x, FiboN);
}

int main()
{
	int n = 0;
	printf("n位数:");
	scanf("%d", &n);
	if (n % 2 == 0)
	{
		JFibonacci(n);//n可以被2整除
	}
	else
	{
		Fibonacci(n);//n不能被2整除
	}
	system("pause");
	return 0;
}

与君共享,如果有更好的建议或意见欢迎留言。

QQ2630420233

                                                                                                                                                                                                珍&源码

猜你喜欢

转载自blog.csdn.net/IT_xiaoQ/article/details/83042730