博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

codevs 3117 高精度练习之乘法

Posted on 2016-01-14 17:04  shaoweiyi  阅读(131)  评论(0编辑  收藏  举报

注意进位问题 还是能处理好的

#include <iostream>
#include<cstdio>
#include <vector>
#include <sstream>
#include <string>
#include <cstring>
#include <cmath>
#include <stack>
#include <algorithm>
using namespace std;

const int MAXL=505;
char al[MAXL];
char bl[MAXL];
int a[MAXL];
int b[MAXL];
int c[MAXL*2]={0};
int stra;
int strb;
int ll;

/*void output()
{
   for(int i=0;i<stra;i++)
    {
        cout<<a[i]<<" ";
    }
    cout<<endl;
    for(int i=0;i<strb;i++)
    {
        cout<<b[i]<<" ";
    }
    cout<<endl;
}*/

void input()
{
scanf("%s",&al);
getchar();
scanf("%s",&bl);
stra=strlen(al);
strb=strlen(bl);
}
void rever()
{
    for(int i=0;i<stra;i++)
    {
        a[i]=al[stra-1-i]-'0';///
    }
    for(int i=0;i<strb;i++)
    {
        b[i]=bl[strb-1-i]-'0';///
    }
    //output();
}

void multi()
{
     ll=(stra+1)+(strb+1)+1;
    int temp=0;
    int i,j;
    for(i=0;i<stra;i++)
    {
      for(j=0;j<strb;j++)
        {
         temp=a[i]*b[j];
         c[i+j]+=temp%10;///这里为什么不能加判定条件?
         c[i+j+1]+=temp/10;
        }

    }
    /*
   for(int i=0;i<=ll;++i)
        cout<<c[i]<<" ";
    cout<<endl;*/
     for(int i=0;i<=ll;i++)
    {
        if(c[i]>9999) c[i+4]+=c[i]/10000;
        c[i]%=10000;
        if(c[i]>999) c[i+3]+=c[i]/1000;
        c[i]%=1000;
        if(c[i]>99) c[i+2]+=c[i]/100;
        c[i]%=100;
        if(c[i]>9) c[i+1]+=c[i]/10;
        c[i]%=10;
    }

     /* for(int i=0;i<=ll;++i)
        cout<<c[i]<<" ";
        cout<<endl;*/
}

void min0()
{
    ///ll代表最后一位的位数
    for(ll;ll>0;ll--)
    {
        if(c[ll]==0) ll--;
        else break;
    }
    for(int i=ll;i>=0;i--)
    {
      cout<<c[i];
    }
    cout<<endl;

}
int main()
{
input();
rever();
multi();
min0();

return 0;
}