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;
}

Posted by richard爱闹 - 3月 15 2015
如需转载,请注明: 本文来自 Richard