POJ1001 高精度乘法

</pre>http://blog.csdn.net/alongela/article/details/6788237http://blog.csdn.net/alongela/article/details/6788237</p><p>        在做1001的时候,看了上面这位大神的博客。但是发现这位大神的思路是对的,但是代码是无法通过的。因此分享下在这位大神的代码基础上修改的能AC的代码。纯属分享,如涉及侵权请联系我,我会立即删掉。</p><p></p><p><pre name="code" class="cpp">#include<stdio.h>
#include<string.h>

char str[10];
int n,dot;
int res[200],a[200],b[10];
int len,lena,lenb;

//处理大数相乘
void mul()
{
    int i,j;
    memset(res,0,sizeof(res));
    for(j=1;j<=lenb;j++)
    {
        for(i=1;i<=lena;i++)
        {
            res[i+j-1]+=a[i]*b[j];
        }
    }
    len=lena+lenb;
    for(int k=1;k<len;k++)
    {
        if(res[k]>9)
        {
            res[k+1]+=res[k]/10;
            res[k]%=10;
        }
    }
    if(res[len]==0)
        len--;
    lena=len;
    for(i=1;i<=lena;i++)
        a[i]=res[i];
}

int main()
{
    int i,j,up,down;
    while(scanf("%s%d",str,&n)!=EOF)
    {
        //处理输入
        memset(a,0,sizeof(a));
        memset(b,0,sizeof(b));
        dot=-1;
        for(i=5,j=1;i>=0;i--)
        {
            if(str[i]!='.') {a[j]=b[j]=str[i]-'0';j++;}
            else dot=i;
        }
        if(dot==-1) lena=lenb=6;
        else lena=lenb=5;
        //处理大数相乘
        for(i=1;i<n;i++) mul();
        //无标点输出
        if(dot==-1)
        {
            for(i=lena;i>=1;i--)
                printf("%d",a[i]);
            printf("\n");
        }
        //有标点输出
        else
        {
            dot=5-dot;
            dot*=n;
            //找非零下界
            for(i=1;i<=lena;i++)
            {
                if(a[i]!=0)
                {
                    down=i;
                    break;
                }
            }
            //找非零上界
            for(j=lena;j>=1;j--)
            {
                if(a[j]!=0)
                {
                    up=j;
                    break;
                }
            }
            if(i==lena+1)
            {
                printf("0\n");
                continue;
            }
            i=up;
            if(up<dot) i=dot;
            j=down;
            if(j>dot) j=dot+1;
            for(;i>=j;i--)
            {
                if(i==dot) printf(".");
                printf("%d",a[i]);
            }
            printf("\n");
        }
    }
    return 0;
}


猜你喜欢

转载自blog.csdn.net/IT_boy_Jason/article/details/50630769