主题思想: 数学题,递推公式推导,加大数加法, 大数加法,有两种思路:
一是,利用字符串模拟每一位,二是,利用int数组,用一个int表示多位数。
比如用一个int表示4位。
代码如下:
void F(){
memset(a,0,sizeof(a));
a[1][0]=3;
a[2][0]=7;
int t=0;
for(int i=3;i<=1000;i++){
t=0;
for(int j=0;j<205;j++){
t=2*a[i-1][j]+a[i-2][j]+t;
a[i][j]=t%10000;
t=t/10000;
}
}
}
输出时,从数组末尾查找第一个不等于0的位置。
至于公式的推导,F(n) 等于F(n-1)中E,W的个数乘以2,N的个数乘以3, F(n-1)中N的个数,等于F(n-2)的个数。
F(n) =2*F(n-1)+F(n-2)
AC代码:
#include <iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int maxn=1005;
int a[maxn][205];
void F(){
memset(a,0,sizeof(a));
a[1][0]=3;
a[2][0]=7;
int t=0;
for(int i=3;i<=1000;i++){
t=0;
for(int j=0;j<205;j++){
t=2*a[i-1][j]+a[i-2][j]+t;
a[i][j]=t%10000;
t=t/10000;
}
}
}
int main()
{
F();
int n;
while(scanf("%d",&n)!=EOF){
int i;
for( i=204;i>=0;i--){
if(a[n][i]!=0){
break;
}
}
printf("%d",a[n][i]);
for(int j=i-1;j>=0;j--){
printf("%04d",a[n][j]);
}
printf("\n");
}
return 0;
}