主题思想: 首先推导出递推公式,
F(n)=F(n-1)+F(n-2) +F(n-4)
然后主要是用数组模拟大数加法,代码简洁,写起来比较快。
数组模拟大数加法模板:
void F(){
f[1][0]=1;
f[2][0]=2;
f[3][0]=4;
f[4][0]=7;
int t=0;
for(int i=5;i<maxn;i++){
t=0;
for(int j=0;j<105;j++){
t=f[i-1][j]+f[i-2][j]+f[i-4][j]+t;
f[i][j]=t%10000;
t=t/10000;
}
}
}
输出时:
for(i=104;i>=0;i--){
if(f[n][i]!=0) break;
}
printf("%d",f[n][i]);
for(int j=i-1;j>=0;j--){
printf("%04d",f[n][j]);
}
AC代码:
#include <iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int maxn=1005;
int f[maxn][105];
void F(){
f[1][0]=1;
f[2][0]=2;
f[3][0]=4;
f[4][0]=7;
int t=0;
for(int i=5;i<maxn;i++){
t=0;
for(int j=0;j<105;j++){
t=f[i-1][j]+f[i-2][j]+f[i-4][j]+t;
f[i][j]=t%10000;
t=t/10000;
}
}
}
int main()
{
int ans=0;
int n;
F();
while(scanf("%d",&n)!=EOF){
int i;
for(i=104;i>=0;i--){
if(f[n][i]!=0) break;
}
printf("%d",f[n][i]);
for(int j=i-1;j>=0;j--){
printf("%04d",f[n][j]);
}
printf("\n");
}
return 0;
}