简单大数,不过公式可能有些难推,先给出我的公式 dp[i] = dp[i-1] + dp[i-2]*2
①:01
②:1001
③:0110 1001
④:1001 0110 0110 1001
⑤:0110 1001 1001 0110 1001 0110 0110 1001
可以发现把每一步分成两分,后一半肯定和上面的一样,所以+dp[i-1],前一半的一半和上两个一样,而后一半只不过是翻转了一下而已,贡献的0没变,所以+dp[i-2]*2..
#include<stdio.h> int ds[1001][501]; int main() { int n,i,j,jw,f; ds[0][0] = ds[1][0] = 0; ds[2][0] = ds[3][0] = 1; for(i=4;i<=1000;i++) for(jw=j=0;j<=500;j++) { ds[i][j] = ds[i-1][j] + ds[i-2][j]*2 + jw; jw = ds[i][j] / 10; ds[i][j] %= 10; } while(scanf("%d",&n)!=EOF) { if(n==1) printf("0"); else for(f=j=500;j>=0;j--) if(ds[n][j] || !f) { printf("%d",ds[n][j]); f = 0; } puts(""); } }