鱼C论坛

 找回密码
 立即注册
查看: 3945|回复: 8

Fibonacci数列 求余数问题求助

[复制链接]
发表于 2017-1-25 19:51:39 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
问题:

Fibonacci数列的递推公式为:Fn=Fn-1+Fn-2,其中F1=F2=1。

当n比较大时,Fn也非常大,现在我们想知道,Fn除以10007的余数是多少。

我的代码:

  1. #include<stdio.h>
  2. int main()
  3. {
  4.         long F1,F2,F3,i,n;
  5.        
  6.         F1=F2=1;
  7.        
  8.         printf("please enter a number(n)!");
  9.         scanf("%ld",&n);
  10.        
  11.         if(n==1||n==2){
  12.                 printf("%ld",1%10007);
  13.         }
  14.         else
  15.         {
  16.                 for(i=1;i<=n-2;i++)
  17.                 {
  18.                         F3=F2+F1;
  19.                         F1=F2;
  20.                         F2=F3;       
  21.                 }
  22.                 printf("%ld",F3%10007);
  23.         }       
  24.         return 0;
  25. }
复制代码


我在一个在线答题网站上提交这段代码,评测结果是错误。
我是编程新手,我想问一下各位大神,代码错在哪儿?
谢谢各位。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2017-1-25 20:21:31 | 显示全部楼层
这个试题好诡异。
我把上面的代码中的  printf("please enter a number(n)!"); 去掉了。
评测分数从之前的0分变成了30分
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-1-25 21:13:24 | 显示全部楼层
我已经知道为什么错了....
虽然还没有人回复我。
这个代码的问题在于,当输入特别大的数时会不满足条件,例如“999999”
个人见解,如有错误,欢迎指出。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-1-25 21:14:30 | 显示全部楼层
黑框眼镜和卷毛 发表于 2017-1-25 20:21
这个试题好诡异。
我把上面的代码中的  printf("please enter a number(n)!"); 去掉了。
评测分数从之前 ...

这个大概是因为题目对于代码的格式规定吧
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-1-25 21:37:26 | 显示全部楼层
一开始溢出了。代码评测网站对算法要求比较高,超出时间是一分不给,输入时只有数据,其他不能显示。我也时是新手,暂时帮你改到这了。
  1. #include<stdio.h>
  2. int main()
  3. {
  4.     long long F1,F2,F3 = 0;
  5.     int n,i;
  6.     F1=F2=1;
  7.     scanf("%d",&n);
  8.    
  9.     if(n==1||n==2){
  10.         printf("%d",1%10007);
  11.     }
  12.     else
  13.     {
  14.         for(i=1;i<=n-2;i++)
  15.         {
  16.             F3=F2+F1;
  17.             F1=F2;
  18.             F2=F3;
  19.         }
  20.         printf("%lld",F3%10007);
  21.     }
  22.     return 0;
  23. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-1-27 12:37:39 | 显示全部楼层
是什么答题网站阿,有网址吗
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-1-27 14:11:24 | 显示全部楼层
写得有点复杂,效率还可以

  1. #include<stdio.h>
  2. #include<math.h>
  3. #define div 10007  

  4. int main()
  5. {
  6.         int F1=1,F2=1,t,t_2,i;
  7.         long long int n;
  8.         t=log(div)/log((sqrt(5)+1)/2);
  9.         t+=t&1;
  10.         t_2=t>>1;

  11.         scanf("%lld",&n);

  12.         for(;;)
  13.         {
  14.                 if ((n-=2)<=0) break;
  15.                 for(;;)
  16.                 {
  17.                         if (n<t)break;
  18.                         for(i=0;i<t_2;i++)
  19.                         {
  20.                                 F1+=F2;
  21.                                 F2+=F1;
  22.                         }
  23.                         n-=t;
  24.                         F1%=div;
  25.                         F2%=div;
  26.                 }
  27.                 if(!n)break;
  28.                 for(;n;n--)
  29.                 {
  30.                         F2+=F1;
  31.                         F1=F2-F1;
  32.                 }
  33.                 F2%=div;
  34.                 break;

  35.         }


  36.         printf("%d",F2);

  37.         return 0;
  38. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-1-27 21:49:16 | 显示全部楼层
本帖最后由 代码农民 于 2017-1-27 23:16 编辑

用unsigned,反正取余要的是数的后几位,并且10007< 65535(2个字节)。
  1. #include <stdio.h>

  2. int
  3. main( void )
  4. {
  5.     unsigned a = 0, b = 1, sum;       // A[ 0 ] = 0, A[ 1 ] = 1, A[ 2 ] = 1, A[ 3 ] = 2,....
  6.     unsigned i, n;                   //n为下标

  7.     scanf( "%u", &n );
  8.     for( i = 2; i < n; ++i )          //从A[ 3 ]开始到A[ n - 1 ], 不满足就忽略该循环
  9.         sum = a + b, a = b, b = sum;  
  10.      
  11.     sum = a + b;                     // A[ n ] = A[ n - 1 ] + A[ n - 2 ]
  12.     printf( "%u", sum % 10007 );   

  13.     return 0;
  14. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-1-29 18:56:38 | 显示全部楼层
fc1735 发表于 2017-1-27 12:37
是什么答题网站阿,有网址吗

蓝桥杯大赛的练习系统
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-7-16 00:41

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表