就是直接用大数搞:
#include <iostream>
using namespace std;
int f[10000][260]={0}; //数组每个单元放8位,这样效率高,
int main()
{
f[1][0]=1;
f[2][0]=1;
f[3][0]=1;
f[4][0]=1;
for(int i=5;i<10000;i++)
{
for(int j=0;j<260;j++)
f[i][j]=f[i-1][j]+f[i-2][j]+f[i-3][j]+f[i-4][j];
for(int j=0;j<260;j++)
if(f[i][j]>100000000)
{
f[i][j+1]+=f[i][j]/100000000; //如果超过了8位,就进位
f[i][j]=f[i][j]%100000000;
}
}
int n;
while(scanf("%d",&n)!=EOF)
{
int k;
for(k=259;k>=0;k--)
if(f[n][k]!=0)break;
printf("%d",f[n][k]);
for(k=k-1;k>=0;k--)
printf("%08d",f[n][k]); //要补全不为,左边用0补着
printf("\n");
}
return 0;
}