hdu 1592 Half of and a Half 大数相加

/**//*
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
#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;
}
浙公网安备 33010602011771号