poj2506 2010.2.17
调试好久的原因:
1. 刚开始求和时,把和与加数放在了一个数组里,导致混乱;
2. 求和时,忘记加下一位的进位了
收获:
1. 原来可以给带下标的数组这样赋值memset(f[2],0,sizeof(f[2]));
2. 数组集体赋值用memcpy(f[1-k],f[2],sizeof(f[2]));
注意:
1.当n=1时,结果是1,因为两种砖块都不用的就是一种方案。
#include <stdio.h>
#include <string.h>
#define MAXL 300
int n,f[3][MAXL],k,g[3];
void doit();
void printit();
void doit()
{
int i,m,j;
int p;
m=n-2;
for(i=1;i<=m;i++)
{
memset(f[2],0,sizeof(f[2]));
for(j=1;j<=g[1-k];j++)
{
f[2][j]+=f[1-k][j]*2;//刚开始少了这个加号
f[2][j+1]=f[2][j]/10;
f[2][j]%=10;
}
if (f[2][g[1-k]+1])
g[1-k]++;
memcpy(f[1-k],f[2],sizeof(f[2]));
// printf("2---1-k\n");
// for(p=g[1-k];p>=1;p--)
// printf("%d",f[1-k][p]);
// printf("\n");
if (g[1-k]<g[k]) g[1-k]=g[k];
memset(f[2],0,sizeof(f[2]));
for(j=1;j<=g[1-k];j++)
{
f[2][j]+=f[1-k][j]+f[k][j];
f[2][j+1]=f[2][j]/10;
f[2][j]%=10;
}
if (f[2][g[1-k]+1])
g[1-k]++;
memcpy(f[1-k],f[2],sizeof(f[2]));
// printf("1-k\n");
// for(p=g[k];p>=1;p--)
// printf("%d",f[k][p]);
// printf("\n");
// printf("k\n");
// for(p=g[1-k];p>=1;p--)
// printf("%d",f[1-k][p]);
// printf("\n\n");
k=1-k;
}
}
void printit()
{
int i;
for(i=g[k];i>=1;i--)
printf("%d",f[k][i]);
printf("\n");
}
int main()
{
while (scanf("%d",&n)!=EOF)
{
if (n==1) printf("1\n");
else
if (n==2) printf("3\n");
else
if (n==0) printf("1\n");
else
{
memset(f,0,sizeof(f));
k=1;
g[k]=1;
g[1-k]=1;
f[k][1]=3;
f[1-k][1]=1;
doit();
printit();
}
}
return 0;
}