题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1250
解题思路
用二维数组(a[n][j)来保存,每8位保存在数组中,处理一下进位就可以了。(前面的n是用来存第几个数,后面的j是用来存如果超出八位数后面的值因为如果只用一维数组或只存一个数字很有可能会超出范围,计算不对所以采用二位数组和一个数字存八位数)
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
int a[8025][300];
void init(){
memset(a,0,sizeof(0));
a[1][1]=1;
a[2][1]=1;
a[3][1]=1;
a[4][1]=1;
for(int i=5;i<=8025;i++){
for(int j=1;j<300;j++){
a[i][j]=a[i-1][j]+a[i-2][j]+a[i-3][j]+a[i-4][j];
}
for(int j=1;j<300;j++){
if(a[i][j]>=100000000){
a[i][j+1]+=a[i][j]/100000000;
a[i][j]=a[i][j]%100000000;
}
}
}
}
int main(int argc, char** argv) {
init();
int n,j;
while(scanf("%d",&n)!=EOF){
for(j=299;j>=0;j--){
if(a[n][j]!=0){
break;
}
}
printf("%d",a[n][j]);
for(int i=j-1;i>=1;i--){
printf("%08d",a[n][i]);
}
printf("\n");
}
return 0;
}