如果在f(n-1)的后面再加一个m,序列仍然是合法的,如果在f(n-2)后面再加一对ff,结果仍然是合法的,还有一种情况来着,就是如果结尾时mf的话,再在后面加f,结果会变成合法的,但是和f(n-2)后加ff重复,所以应该加ff.所以最后就是f(n)=f(n-1)+f(n-2)+f(n-4)了。
#include "stdio.h"
#include "string.h"
char s[1002][400];
int main()
{
int n;
int i,j;
int len=1,l,carry;
int a;
char b[400],t;
memset(s,0,sizeof(s));
s[0][0]='1';
s[1][0]='1';
s[2][0]='2';
s[3][0]='4';
for(i=4;i<=1000;i++)
{
carry=0;
for(j=0;j<len;j++)
{
a=(s[i-1][j]==0?0:(s[i-1][j]-'0'))+(s[i-2][j]==0?0:(s[i-2][j]-'0'))+(s[i-4][j]==0?0:(s[i-4][j]-'0'))+carry;
if(a>=10)
{
carry=a/10;
s[i][j]=a%10+'0';
}
else
{
s[i][j]=a+'0';
carry=0;
}
}
if(carry)
s[i][len++]=carry+'0';
}
while(scanf("%d",&n)==1)
{
l=strlen(s[n]);
memset(b,0,sizeof(b));
strcpy(b,s[n]);
for(i=0;i<l/2;i++)
{
t=b[i];
b[i]=b[l-i-1];
b[l-i-1]=t;
}
printf("%s\n",b);
}
return 0;
}