Add Num Bugs
http://bestcoder.hdu.edu.cn/contests/contest_showproblem.php?pid=1001&cid=571
这道题目看起来很简单,其实写残了,好多bug没处理,包括第一遍扫到题目的leading zero到后面就忘得一干二净。
高精度加法主要还是需要先reverse之后然后再加,加完之后要去掉后导0,然后再reverse结果,里面有一个地方改成char*之后,要存储len然后循环每次不必调用strlen()
这是一个之前的错误,string就不会出现这个问题。
WA和T了无数发后,终于A了
T有char开的小了,导致\0没有地方放,还有没处理后导0,以及处理前导0忘记把全是0的单独处理了,等等。再次感谢cxlove帮我看代码
最后修改后的相对clean的代码
char DigToCh(int num)
{
if(num<=9) return char(num+'0');
else return char(num-10+'a');
}
int ChToDig(char c)
{
if(c<='9' && c>='0') return (c-'0');
else return c-'a'+10;
}
char str[100][201];
int Len[100];
void RemoveBehindZero(char* str, int &n)
{
int i;
for(i=n-1;i>=0;i--) if(str[i]!='0') break;
if(i<0)
{
str[0]='0', str[1]='\0', n=1;
return ;
}
str[i+1]='\0';
n=i+1;
}
int main()
{
int n, b;
while(cin>>n>>b)
{
for(int i=0;i<n;i++) scanf("%s", str[i]), getchar();
//for(int i=0;i<n;i++) cout<<str[i]<<endl;
int maxlen=0;
for(int i=0;i<n;i++)
{
int len=strlen(str[i]);
//RemoveLeadZero(str[i], len);
reverse(str[i], str[i]+len);
Len[i]=len;
maxlen=max(maxlen,len);
}
char ans[maxn];int ansi=0;
for(int i=0;i<maxlen;i++)
{
int sum=0;
for(int j=0;j<n;j++)
{
if(i<Len[j]) sum+=ChToDig(str[j][i]);
}
sum%=b;
ans[ansi++]=DigToCh(sum);
//ans.push_back();
}
ans[ansi]='\0';
int len=ansi;
RemoveBehindZero(ans, len);
reverse(ans, ans+len);
cout<<ans<<endl;
}
return 0;
}