凭什么高精度乘法会出这种错误?
noip吧
全部回复
仅看楼主
level 8
dugucloud 楼主
[一楼喂熊]
2010年10月31日 14点10分 1
level 8
dugucloud 楼主
/* 输入其他数据没问题,输入98 99 999 99999之类的数就有问题了! */
#include <stdio.h>
#include <string.h>
const int SIZE=20000;
int input (char num[])
{
     int length, ist;
     char tmp[SIZE];
     scanf("%s",tmp);
     length=strlen(tmp)-1;
     for (ist=0; ist<=length; ist++)
         num[length-ist]=tmp[ist]-'0';
     return length+1;
}
int mult (char foo[], int foolen, char bar[], int barlen, char sol[])
{
     int ist, jnd, pos;
     for (ist=0; ist<foolen; ist++)
         for (jnd=0; jnd<barlen; jnd++)
         {
             pos=ist+jnd;
             sol[pos] += foo[ist]*bar[jnd];
             if ( sol[pos]>10 )
             {
                  sol[pos+1]=sol[pos]/10;
                  sol[pos]%=10;
             }
         }
     pos++;
     while ( sol[pos]!=0 )
     {
           if (sol[pos]>10)
           {
              sol[pos+1]=sol[pos]/10;
              sol[pos]%=10;
           }
           pos++;
     }
     return pos;
}
void output (char num[], char length)
{
     char tmp[SIZE+SIZE+2];
     int ist;
     length--;
     for (ist=0; ist<=length; ist++)
         tmp[length-ist]=num[ist]+'0';
     printf("%s\n", tmp);
}
int main ()
{
    char foo[SIZE], bar[SIZE], sol[SIZE+SIZE+2];
    int foolen, barlen, sollen;
    foolen = input(foo);
    barlen = input(bar);
    sollen = mult(foo, foolen, bar, barlen, sol);
    output(sol,sollen);
    return 0;
}

2010年10月31日 14点10分 2
level 13
              if ( sol[pos]>10 )
              {
                   sol[pos+1]=sol[pos]/10;
                   sol[pos]%=10;
              }
把sol[pos+1]后面改成+=
2010年10月31日 14点10分 3
level 8
dugucloud 楼主
调试几十分钟,刚才突然发现问题所在:
sol[pos+1]=sol[pos]/10;
应为:
sol[pos+1]+=sol[pos]/10;
2010年10月31日 14点10分 4
level 8
dugucloud 楼主
回复:3楼
谢谢大牛。
2010年10月31日 14点10分 5
1