C语言数列如何加速太慢

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言数列如何加速太慢相关的知识,希望对你有一定的参考价值。

当输入50计算太慢了,字典可以加快递归

看下面其他语言实例 ,将C语言如何改成用字典加速,

#include <stdio.h>
unsigned int Fibonacci(int n);
int main( void )

int n;
while (scanf ("%d", &n), n>0)//输入负值或0结束
printf("%d\n",Fibonacci(n));

return 0;

unsigned int Fibonacci(int n)

if( n == 1 || n == 2) // 递归结束的条件,求前两项
return 1;
else
return Fibonacci(n-1)+Fibonacci(n-2); // 如果是求其它项,先要求出它前面两项,然后做和。


用字典加速递归

才发现原来字典用到递归中,速度可变快
一般求斐波那契数列估计很多人都用以下代码吧:
deffab(n):
ifn==1orn==2:
return1
else:
returnfab(n-1)+fab(n-2)
if__name__=='__main__':
num=int(input('Pleaseinputanumber:'))
print(fab(num))
对于这段代码我相信大家都懂得,那我就不解释了,直接奔入字典的加速环节=。=
请看如下代码:
deffibonacci(n):
ifninDict:
returnDict[n]
else:
newValue=fibonacci(n-1)+fibonacci(n-2)
Dict[n]=newValue
returnnewValue
if__name__=='__main__':
Dict=1:1,2:1
num=int(input('Pleaseinputanumber:'))
print(fibonacci(num))
字典首先定义了当n=1,2时的值。当函数fibonacci被调用,先检查字典中是否包含要计算的结果。
如果有就立刻返回结果,不再做递归调用。若没有,就得计算新值,并且新值在函数返回前加入到字典中。
用这个新版本的fibonacci函数,我们可以瞬间计算出n=40的值,比老版本的fibonacci函数快了很多。

#include <stdio.h>
unsigned int Fibonacci(int n);
int main(void) 
    int n;
    while (scanf ("%d", &n), n > 0) 
        printf("%u\\n",Fibonacci(n));
    
    return 0;

unsigned int Fibonacci(int n) 
    if (n <= 0) return 0;
    if (n == 1 || n == 2) return 1;
    else 
        int a[2] = 1, 1, i = 3;
        while (i <= n) 
            a[i % 2] = a[i % 2] + a[(i - 1) % 2];
            i++;
        
        return a[(i - 1) % 2];
    

其实这不需要递归,稍微变一下算法就行了。另外,你的printf里的格式字符串错了,应该是"%u"而不是"%d"。

追问

太快了,C语言可以用字典?

追答

……难道不好么……迭代本来就要比递归快很多的……

参考技术A #include
<stdio.h>
unsigned int
Fibonacci
(int n);
int main(void)
int n;
while (scanf ("%d", &n), n > 0)
printf("%u\n",Fibonacci(n));

return 0;

unsigned int Fibonacci(int n)
if (n <= 0) return 0;
if (n == 1 || n == 2) return 1;
else
int a[2] = 1, 1, i = 3;
while (i <= n)
a[i % 2] = a[i % 2] + a[(i - 1) % 2];
i++;

return a[(i - 1) % 2];

其实这不需要递归,稍微变一下算法就行了。另外,你的printf里的格式字符串错了,应该是"%u"而不是"%d"。
参考技术B 在windows里面如果通过gdi写小游戏,也会闪屏的。
解决的办法是每次只刷新与前一屏幕有差距的区域,而不是刷新整个窗口。
我想你的问题也是同样,但是你在字符模式刷新局部区域比图形模式麻烦一些。

P1939模板矩阵加速(数列)

P1939【模板】矩阵加速(数列)
难受就难受在a[i-3],这样的话让k=3就好了。

  1 #include<iostream>
  2 #include<cstdio>
  3 #include<queue>
  4 #include<algorithm>
  5 #include<cmath>
  6 #include<ctime>
  7 #include<set>
  8 #include<cstring>
  9 #define mod 1000000007
 10 #define For(i,a,b) for(register long long i=a;i<=b;i++)
 11 #define p(a) putchar(a)
 12 #define g() getchar()
 13 //by war
 14 //2017.10.26
 15 using namespace std;
 16 long long k,t;
 17 
 18 struct matrix
 19 {
 20     long long a[5];
 21     long long b[5][5];
 22     matrix operator *(const matrix&c)const
 23     {
 24         matrix r;
 25         For(i,1,3)
 26           For(j,1,3)
 27           {
 28              r.b[i][j]=0;
 29              For(k,1,3)
 30             r.b[i][j]=(r.b[i][j]+(b[i][k]*c.b[k][j])%mod)%mod;
 31           }
 32         return r;
 33     }
 34 }a;
 35 
 36 void in(long long &x)
 37 {
 38     long long y=1;
 39     char c=g();x=0;
 40     while(c<0||c>9)
 41     {
 42     if(c==-)
 43     y=-1;
 44     c=g();
 45     }
 46     while(c<=9&&c>=0)x=x*10+c-0,c=g();
 47     x*=y;
 48 }
 49 void o(long long x)
 50 {
 51     if(x<0)
 52     {
 53         p(-);
 54         x=-x;
 55     }
 56     if(x>9)o(x/10);
 57     p(x%10+0);
 58 }
 59 
 60 matrix ksm(matrix a,long long b)
 61 {
 62     matrix r=a;b--;
 63     if(b==0)
 64     return r;
 65     while(b%2==0)
 66     {
 67         a=a*a;
 68         b>>=1;
 69     }
 70     while(b>0)
 71     {
 72         if(b%2==1)
 73         r=r*a;
 74         a=a*a;
 75         b>>=1;
 76     }
 77     return r;
 78 }
 79 
 80 int main()
 81 {
 82     in(t);
 83     while(t--)
 84     {
 85     in(k);
 86     if(k==1||k==2||k==3)
 87     {
 88         o(1),p(\n);
 89         
 90     }
 91     else
 92     {
 93     a.a[1]=1;
 94     a.a[2]=1;
 95     a.a[3]=1;
 96     a.b[1][1]=0;
 97     a.b[1][2]=0;
 98     a.b[1][3]=1;
 99     a.b[2][1]=1;
100     a.b[2][2]=0;
101     a.b[2][3]=0;
102     a.b[3][1]=0;
103     a.b[3][2]=1;
104     a.b[3][3]=1;
105     matrix r,ans;
106     r=ksm(a,k-3);
107     for(register int i=1;i<=3;i++)
108           For(j,1,3)
109           {
110              ans.a[i]=0;
111              For(k,1,3)
112             ans.a[i]=(ans.a[i]+(a.a[i]*r.b[k][j])%mod)%mod;
113           } 
114     For(i,3,3)
115     o((ans.a[i]%mod+mod)%mod),p(\n);        
116     }
117     
118     }
119      return 0;
120 }

 

以上是关于C语言数列如何加速太慢的主要内容,如果未能解决你的问题,请参考以下文章

C语言编程,输入两个数列,求交集!

C语言常用算法中,查找无序数列的算法都有哪些?

c语言,编程实现,求斐波那契数列,1,1,2,3,5,8,......的前20项及前20项和

我想用递归写斐波那契数列,c语言

如何用C语言输出斐波那契数列的前n项

用C语言编写斐波那契数列前10项(用简单的方法且只有两个变量)()非递归方法