
Code

/**//*
2008-12-22 18:52:06 Accepted 1592 0MS 280K 588B
后来我就改了一下LEN和N(改回初始状态了),结果时间就要15ms了,这说明程序执行时间只是一个参考,不是非常精确的
题意是每次遇到一个人,分给他一半且一个里面的半个
*/
#include<iostream>
#define LEN 105
#define N 1000//记录位数

int num[1001][LEN];

void Add(int *n1, int *n2,int *res)//两个大数数组相加


{
int tmp;
for(int i=LEN-1;i>0;i--)

{
tmp=n1[i]+n2[i];
if(i==LEN-1)
tmp+=1;
res[i-1]+=tmp/N;
res[i]+=tmp%N;
}
}

void make()//产生结果


{
for(int i=0;i<1001;i++)
Add(num[i],num[i],num[i+1]);
}

void print(int n)//输出结果


{
for(int i=0;i<LEN;i++)
if(num[n][i])
break;
printf("%d",num[n][i++]);
for(;i<LEN;i++)
printf("%03d",num[n][i]);//不足补0
puts("");
}

int main()


{
int n;
num[0][LEN-1]=1;//初始化
make();
while(scanf("%d",&n)!=EOF)

{
print(n);
}
return 0;
}


附:
0ms的code

Code
#include<iostream>
#define LEN 110
#define N 1000

int num[N+1][LEN];

void Add(int *n1, int *n2,int *res)


{
int tmp;
for(int i=LEN-1;i>0;i--)

{
tmp=n1[i]+n2[i];
if(i==LEN-1)
tmp+=1;
res[i-1]+=tmp/N;
res[i]+=tmp%N;
}
}

void make()


{
for(int i=0;i<N;i++)
Add(num[i],num[i],num[i+1]);
}

int main()


{
int n;
num[0][LEN-1]=1;
make();
while(scanf("%d",&n)!=EOF)

{
for(int i=0;i<LEN;i++)
if(num[n][i])
break;
printf("%d",num[n][i++]);
for(;i<LEN;i++)
printf("%03d",num[n][i]);
puts("");
}
return 0;
}
posted @
2008-12-22 19:19
sunjian
阅读(
479)
评论()
收藏
举报