| 
          【C语言】入门训练 Fibonacci数列 | 
        
                
          
            
                         一派掌门 二十级              | 
          
            
            
             
              问题描述 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]。
              
                       | 
        
                
          
            
                         一派掌门 二十级              | 
          
            
            
             
              错误的答案: #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                
             | 
|
        
                
          
            
                         一派掌门 二十级              | 
          
            
            
             
              正确的答案: #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                
             | 
|
        
                
          
            
                         一派掌门 二十级              | 
          
            
            
             
              递归法写出的函数虽然简单,但是很耗系统资源。             
             | 
|
        
                
          
            
                         一派掌门 二十级              | 
          
            
            
             
              输入:1000000 输出:114
  -------------------------------- Process exited after 11.82 seconds with return value 0 Press any key to continue . . .             
             | 
|
        
                
          
            
                         一派掌门 二十级              | 
          
            
            
             
              2楼的程序,即便是输入50,都无法得出计算结果。不过输入40的话: 40 2573
  -------------------------------- Process exited after 2.181 seconds with return value 0 Press any key to continue . . .              
             | 
|
        
                
          
            
                         一派掌门 二十级              | 
          
            
            
             
              其实,应该不需要判断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; }              
             | 
|
        
                
          
            
                         一派掌门 二十级              | 
          
            
            
             
              仍然是前两个数相加得到新数,只不过数组只存储三个元素,且都是存储的都是余数。             
             | 
|