7-9 《Fibonacci 数列》
7-9 《Fibonacci 数列》
思路:吃过前面《序列求和》问题的亏
但还是要尝试一下循环大法
Fn=Fn-1+Fn-2
定义int型 a
Fn-1
, bFn-2
, cFn
每循环一次 b=a,a=c;
unsigned int 0~4294967295
int 2147483648~2147483647
unsigned long 0~4294967295
long 2147483648~2147483647
long long的最大值:9223372036854775807
long long的最小值:-9223372036854775808
unsigned long long的最大值:18446744073709551615int64的最大值:9223372036854775807
__int64的最小值:-9223372036854775808
unsigned __int64的最大值:18446744073709551615
循环大法(虽可能会导致超时,但不能排除)
#include<iostream>
#include<time.h>
using namespace std;
int main(){
int n,a=1,b=1,c;
cin>>n;
clock_t start = clock();
for(int i=3;i<=n;i++,b=a,a=c){
c=a+b;
}
clock_t finish = clock();
cout<<c%10007<<endl;
cout<<finish-start<<"ms";
return 0;
}
运行结果:
以数据规模最大值1,000,000
赋给n时,耗时5ms左右 。暴力算法勉强。
附上原题
问题描述
Fibonacci 数列的递推公式为:Fn=Fn-1+Fn-2,其中 F1=F2=1。
当 n 比较大时,Fn 也非常大,现在我们想知道,Fn 除以 10007 的余数是多少。
输入格式
输入包含一个整数 n。
输出格式
输出一行,包含一个整数,表示 Fn 除以 10007 的余数。
说明:在本题中,答案是要求 Fn 除以 10007 的余数,因此我们只要能算出这个余数即可,而
不需要先计算出 Fn 的准确值,再将计算的结果除以 10007 取余数,直接计算余数往往比先算
出原数再取余简单。
样例输入
10
样例输出
55
样例输入
22
样例输出
7704
数据规模与约定
1 <= n <= 1,000,000。