蓝桥杯训练系统 1 数列

 

题意描述:
Fibonacci数列 的递推公式为:Fn=Fn-1+Fn-2,其中F1=F2=1。
当n比较大时,Fn也非常大,现在我们想知道,Fn除以10007的余数是多少。
输入包含一个整数n,输出包含一个整数,表示fn除以10007的余数,n(1<=n<=1000000)
解题思路:
类似于把余数轮番相加当余数凑够10007的倍数则自动消去。
代码实现:
 1 #include<stdio.h>
 2 #define N 1000000
 3 int main()
 4 {
 5  int f[N],n,i,t=0;
 6  
 7  scanf("%d",&n);
 8  
 9  f[0]=f[1]=1;
10  
11  for(i=2;i<n;i++)
12  {
13   f[i]=(f[i-1]+f[i-2])%10007;
14  }
15  
16  printf("%d\n",f[n-1]);
17  
18  return 0;
19  } 

 


自己提交的内存太大,浪费时间。查找网上答案之后发现一种表达较大数的格式。
 
 1 #include<stdio.h>
 2 int dg(int n)
 3 {
 4  int s;
 5  if(n==0||n==1) s=1;
 6  else
 7   return s=dg(n-1)+dg(n-2);
 8  return s;
 9 }
10 int main()
11 {
12  unsigned long s=0,a=dg(21),b=dg(22),i,n;
13  
14  scanf("%d",&n);
15  
16  if(n<20) printf("%d\n",dg(n-1));
17  
18  else 
19  {
20   for(i=23;i<n;i++)
21   {
22    s=(a+b)%10007;
23    a=b;
24    b=s;//这里将余数直接加进去减少了运算量,因为没有被算进去的一定不到10007的倍数,所以只计算余数不影响。 
25    } 
26     printf("%d\n",s);
27    }  
28   
29    
30    return 0;
31 }

 

 

 
 

 

posted @ 2019-03-01 17:05  沅清的小窝  阅读(246)  评论(0)    收藏  举报