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函数快了很多。
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语言数列如何加速太慢的主要内容,如果未能解决你的问题,请参考以下文章