C语言_CL_求第N个斐波那契数

2020年9月19日 07:40:42

fib1:O (2^n)
fib2:O(n)

VS2019是32位的,Dev C++是64位的。

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <time.h>

int fib1(int N)
{
	if (N == 1 || N == 2)
		return 1;
	return fib1(N - 1) + fib1(N - 2);
}

int fib2(int n)
{
	if (n == 2 || n == 1)
		return 1;
	int prev = 1, curr = 1;
	for (int i = 3; i <= n; i++)
	{
		int sum = prev + curr;
		prev = curr;
		curr = sum;
	}
	return curr;
}

int main(void)
{
	int i,j,k;
	clock_t start1, stop1;
	double duration1;
	clock_t start2, stop2;
	double duration2;

	printf("你想求第几个斐波那契数: ");
	scanf("%d", &i);

	start1 = clock();
	j = fib1(i);
	stop1 = clock();

	start2 = clock();
	k = fib2(i);
	stop2 = clock();

	duration1 = ((double)(stop1 - start1)) / CLOCKS_PER_SEC;
	duration2 = ((double)(stop2 - start2)) / CLOCKS_PER_SEC;

	printf("fib1_你想求的第 %d 个斐波那契数是: %d\n", i, fib1(i));
	printf("fib1函数运行时间: %lf 秒\n", duration1);
	printf("fib2_你想求的第 %d 个斐波那契数是: %d\n", i, fib2(i));
	printf("fib2函数运行时间: %lf 秒\n", duration2);

	return 0;
}


VS运行结果:

你想求第几个斐波那契数: 42
fib1_你想求的第 42 个斐波那契数是: 267914296
fib1函数运行时间: 18.042000 秒
fib2_你想求的第 42 个斐波那契数是: 267914296
fib2函数运行时间: 0.000000 秒

DEV运行结果:

你想求第几个斐波那契数: 42
fib1_你想求的第 42 个斐波那契数是: 267914296
fib1函数运行时间: 1.640000 秒
fib2_你想求的第 42 个斐波那契数是: 267914296
fib2函数运行时间: 0.000000 秒

【原来64位软件比32位软件的运算速度快那么多】
【出于好奇,我用DEV运行了一下第50个数,结果,好像栈溢出了】

你想求第几个斐波那契数: 50
fib1_你想求的第 50 个斐波那契数是: -298632863
fib1函数运行时间: 76.185000 秒
fib2_你想求的第 50 个斐波那契数是: -298632863
fib2函数运行时间: 0.000000 秒

在DEV修改代码后

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <time.h>

int fib1( long long N)
{
	if (N == 1 || N == 2)
		return 1;
	return fib1(N - 1) + fib1(N - 2);
}

int fib2(long long n)
{	
	int i;
	long long sum;
	if (n == 2 || n == 1)
		return 1;
	long long prev = 1, curr = 1;
	for (i = 3; i <= n; i++)
	{
		sum = prev + curr;
		prev = curr;
		curr = sum;
	}
	return curr;
}

int main(void)
{
	int i;
	long long j,k;
	clock_t start1, stop1;
	double duration1;
	clock_t start2, stop2;
	double duration2;

	printf("你想求第几个斐波那契数: ");
	scanf("%d", &i);

	start1 = clock();
	j = fib1(i);
	stop1 = clock();

	start2 = clock();
	k = fib2(i);
	stop2 = clock();

	duration1 = ((double)(stop1 - start1)) / CLOCKS_PER_SEC;
	duration2 = ((double)(stop2 - start2)) / CLOCKS_PER_SEC;
	
	printf("fib1_你想求的第 %d 个斐波那契数是: %lld\n", i, fib1(i));
	printf("fib1函数运行时间: %lf 秒\n", duration1);
	printf("fib2_你想求的第 %d 个斐波那契数是: %lld\n", i, fib2(i));
	printf("fib2函数运行时间: %lf 秒\n", duration2);

	return 0;
}


运行结果:

你想求第几个斐波那契数: 50
fib1_你想求的第 50 个斐波那契数是: 3996334433
fib1函数运行时间: 78.732000 秒
fib2_你想求的第 50 个斐波那契数是: 3996334433
fib2函数运行时间: 0.000000 秒

天哪,fib2真的那么快?
于是,我单独运行fib2函数,试了试,发现,键盘输入50,虽然结果是正整数,但是得到的结果是错误的。
经过尝试后发现,输入上限是45,输入46及以上的数字,结果是不正确的。

还是用修改前的代码来运行。

在VS2019(32位)上,运行结果是:

你想求第几个斐波那契数: 45
fib1_你想求的第 45 个斐波那契数是: 1134903170
fib1函数运行时间: 76.742000 秒
fib2_你想求的第 45 个斐波那契数是: 1134903170
fib2函数运行时间: 0.000000 秒

在DEV C++(64位)上,运行结果是:

你想求第几个斐波那契数: 45
fib1_你想求的第 45 个斐波那契数是: 1134903170
fib1函数运行时间: 6.860000 秒
fib2_你想求的第 45 个斐波那契数是: 1134903170
fib2函数运行时间: 0.000000 秒

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值