Fibonacci数列
/* -- c语言 -- */
问题描述
资源限制
时间限制:1.0s 内存限制:256.0MB
问题描述
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。
第一次尝试
数组报错
APP 中接收数据代码:int main(){
int n;
scanf("%d",&n);
int a[n+1];
a[1]=a[2]=1;
for(int i=3;i<=n;i++){
a[i]=a[i-2]+a[i-1];
}
printf("%d",a[n]%10047);
return 0;
}
原因分析
说明:在本题中,答案是要求Fn除以10007的余数,因此我们只要能算出这个余数即可,而不需要先计算出Fn的准确值,再将计算的结果除以10007取余数,直接计算余数往往比先算出原数再取余简单。
没有注意存储空间的问题
解决方案:
改代码一
int main(){
int n,f1=1,f2=1,f3;
scanf("%d",&n);
if(n<3)
printf("1");
else{
for(int i=3;i<=n;i++){
f3=(f1+f2)%10007;
f1=f2;
f2=f3;
}
printf("%d",f3);
}
return 0;
}
抱歉,还是报错了,,,
为什么,,,
改代码二
数据规模:1 <= n <= 1,000,000 -_-是有点大int main(){
unsigned long n,f1=1,f2=1,f3;
scanf("%ld",&n);
if(n<3)
printf("1");
else{
for(int i=3;i<=n;i++){
f3=(f1+f2)%10007;
f1=f2;
f2=f3;
}
printf("%ld",f3);
}
return 0;
}
小扒手偷偷看了很多大佬的代码,发现数据存储类型也很重要
标识符 | 长度 | 大佬解释 |
---|---|---|
unsigned int &&int | - - > | int的长度没有确定的规范,这和机器的字有关系,如果使用的机器字长为32bit,那么程序中int就表示32位长 |
unsigned short &&short | 16bit | short 刚好是long的一半 |
unsigned long &&long | 32bit | long是long long int的一半 |
long long int | 64bit | 仅仅只为64位的系统而生,所以长度只能是64bit |
(表格从下往上看) |
还有一点是,整数型变量分为有符号整数型变量和无符号整数型变量。
signed存储时,最高的bit表示符号位;unsigned,最高的 bit也是数值位,so 这道题用unsigned long才过
改代码三
多余的不要
int main(){
//unsigned long 表示无符号位长整数,最高位不占据做符号位,内存更大
unsigned long n,f1=1,f2=1,f3=1,i;
scanf("%ld",&n);
if(n>2){
for(i=3;i<=n;i++){
f3=(f1+f2)%10007;
f1=f2;
f2=f3;
}
}
printf("%ld",f3);
return 0;
}
bulingbuling收工