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 秒