|  | 
          1樓
          巨大八爪鱼
          2015-11-21 21:26
          
          
            问题描述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。
 
 锦囊1
使用数组来保存F序列,只保存除10007的余数。
 锦囊2
先令F[1]=1, F[2]=1,然后用F[i]=(F[i-1]+F[i-2])%10007来计算F[i]。
 
 | 
    
      |  | 
          2樓
          巨大八爪鱼
          2015-11-21 21:27
          
          
            错误的答案:#include <stdio.h>
 
 //这是老师上课讲的递归法。。。
 int F(int n)
 {
 if (n <= 2)
 return 1;
 else
 return F(n - 1) + F(n - 2);
 }
 
 int main()
 {
 int n;
 int reminder;
 scanf("%d", &n);
 reminder = F(n) % 10007;
 printf("%d\n", reminder);
 return 0;
 }
 
 评测结果  运行超时
 得分  30
 CPU使用  运行超时
 内存使用  62.62MB
 
 | 
    
      |  | 
          3樓
          巨大八爪鱼
          2015-11-21 21:28
          
          
            正确的答案:#include <stdio.h>
 
 int main()
 {
 int n, i;
 int F[3] = {1, 1, 1};
 scanf("%d", &n);
 if (n >= 3)
 {
 for (i = 3; i <= n; i++)
 {
 F[2] = (F[1] + F[0]) % 10007;
 F[0] = F[1];
 F[1] = F[2];
 }
 }
 printf("%d\n", F[2]);
 return 0;
 }
 
 评测结果  正确
 得分  100
 CPU使用  0ms
 内存使用  1.597MB
 
 | 
    
      |  | 
          4樓
          巨大八爪鱼
          2015-11-21 21:30
          
          
            递归法写出的函数虽然简单,但是很耗系统资源。 | 
    
      |  | 
          5樓
          巨大八爪鱼
          2015-11-21 21:30
          
          
            输入:1000000输出:114
 
 --------------------------------
 Process exited after 11.82 seconds with return value 0
 Press any key to continue . . .
 | 
    
      |  | 
          6樓
          巨大八爪鱼
          2015-11-21 21:31
          
          
            2楼的程序,即便是输入50,都无法得出计算结果。不过输入40的话:40
 2573
 
 --------------------------------
 Process exited after 2.181 seconds with return value 0
 Press any key to continue . . .
 
 | 
    
      |  | 
          7樓
          巨大八爪鱼
          2016-3-1 17:02
          
          
            其实,应该不需要判断n>=3:#include <stdio.h>
 #include <stdlib.h>
 
 int main()
 {
 int n, i;
 int F[3] = {1, 1, 1};
 scanf_s("%d", &n);
 for (i = 3; i <= n; i++)
 {
 F[2] = (F[0] + F[1]) % 10007;
 F[0] = F[1];
 F[1] = F[2];
 }
 printf("%d\n", F[2]);
 system("pause");
 return 0;
 }
 
 | 
    
      |  | 
          8樓
          巨大八爪鱼
          2016-3-1 17:03
          
          
            仍然是前两个数相加得到新数,只不过数组只存储三个元素,且都是存储的都是余数。 |