大数乘法
http://poj.grids.cn/practice/solution/1789958/
问题描述:
求两个不超过200位的非负整数的积。
输入:
有两行,每行是一个不超过200位的非负整数,没有多余的前导0。
输出:
一行,即相乘后的结果。结果里不能有多余的前导0,即如果结果是342,那么就不能输出为0342。
输入样例:
12345678900
98765432100
输出样例:
1219326311126352690000
代码:
#include <iostream>
using namespace std;
#define N 200
#include<cstring>
#include<string>
int a[N],b[N],sum[2*N];
void multi(string s1,string s2,int sum[])
{
memset(sum,0,sizeof(sum));
int i,j,index;
index=0;
for(i=s1.size()-1;i>=0;i--)
a[index++]=s1[i]-'0';
index=0;
for(i=s2.size()-1;i>=0;i--)
b[index++]=s2[i]-'0';
for(i=0;i<s1.size();i++)
{
for(j=0;j<s2.size();j++)
sum[i+j]+=a[i]*b[j];
}
for(i=0;i<2*N;i++)
{
if(sum[i]>9)
{
sum[i+1]+=sum[i]/10;
sum[i]=sum[i]%10;
}
}
bool flag=false;
for(i=2*N-1;i>=0;i--)
{
if(flag||sum[i])
{
flag=true;
cout<<sum[i];
}
}
if(!flag)
cout<<"0";
cout<<endl;
}
int main(int argc, char *argv[])
{
string s1,s2;
cin>>s1>>s2;
multi(s1,s2,sum);
return 0;
}