一、计算有误
#include <stdio.h>
int main(){
int i,n;
int f1=1;
int f2=1;
scanf("%d",&n);
for(i = 3;i < n/2+2;i++){
f1=f1+f2;
f2=f2+f1;
}
printf("%d",f2%10007);
return 0;
}
二、超时
#include<stdio.h>
#include<stdlib.h>
int Fibonacci (int n)
{
int Fn;
if (n==1 || n==2)
{
Fn=1;
}
else
{
Fn = Fibonacci(n-1) + Fibonacci(n-2);
}
return Fn;
}
int main(void)
{
int n,x,Fn;
scanf("%d",&n);
Fn = Fibonacci(n);
x = Fn%10007;
printf("%d",x);
return 0;
}
三、正确
#include <stdio.h>
int main(){
unsigned long s=0,f1=1,f2=1,f3=1,n=0;
scanf("%d",&n);
if(n>2){
for(s=3;s<=n;s++){
f3=(f2+f1)%10007;
f1=f2;
f2=f3;
}
}
printf("%d",f3);
return 0;
}
解释:关于f3的值,
当 f2+f1 小于10007时,它们的余数值就是f2+f1,所以不用考虑;
当 f2+f1 大于10007时,有一数学公式:两个数的和的余数等于这两个数余数的和 ,所以这就可以解释 f3=(f2+f1)%10007; 得出的f3的值永远是对的余数。