#include<cstdio>
#include<cstdlib>
#include<iostream>
#include<cstring>
using namespace std;
struct node{int d[100000],l;};
char s[1000000];
node a,b,c;
void read(node &x)
{
scanf("%s",s);
x.l=strlen(s);
memset(x.d,0,sizeof(x.d));
for (int i=0;i<x.l;i++)
x.d[x.l-i-1]=s[i]-'0';
}
int main()
{
read(a);read(b);
// if (la>lb) lc=la;else lc=lb;
memset(c.d,0,sizeof(c.d));
for (int i=0;i<a.l;i++)
{
for (int j=0;j<b.l;j++)
c.d[i+j]+=a.d[i]*b.d[j];
}
c.l=a.l+b.l-1;
for (int i=0;i<c.l;i++)
{
c.d[i+1]+=c.d[i]/10;
c.d[i]%=10;
}
while (c.d[c.l]>0)
{
c.d[c.l+1]=c.d[c.l]/10;
c.d[c.l]%=10;
c.l++;
}
while (c.l>1 && c.d[c.l-1]==0) c.l--;
for (int i=c.l-1;i>=0;i--)
printf("%d",c.d[i]);
return 0;
}
分治(仅函数)
list<char> Mul(list<char> num1,list<char> num2) // 分治法求两大数的积
{
list<char> ans;
int sign = 0;
int len1,len2,len;
list<char>::iterator iter1,iter2,iter;
list<char> high,low;
list<char> anshigh,anslow;
int th,tl;
int i,j,k;
//print(num1);cout << endl;
//print(num2);cout << endl;
if(num1.size() == 1 && num2.size() == 1) //如果两数都已是一位数,则进行运算
{
th = *(num1.begin()) - '0';
tl = *(num2.begin()) - '0';
th *= tl;
ans.push_front( th % 10 + '0');
ans.push_front( th / 10 + '0');
return ans;
}
else if(num1.size() == 1 && num2.size() > 1) //如果num1位数大于1,则对Num1分治求积
{
if(*(num2.begin()) == '-')
{
sign = 1;
num2.pop_front();
}
len2 = num2.size();
if(len2 == 1)
{
ans = Mul(num1,num2);
if(sign)
ans.push_front('-');
}
else
{
for(iter= num2.begin(),i = 0; i < len2 / 2; i++,iter++)
{
high.push_back(*iter);
}
for(;iter!=num2.end();iter++)
{
low.push_back(*iter);
}
len = low.size();
anshigh = Mul(num1,high); //num1分为两部分,high,low
anslow = Mul(num1,low);
for(i = 0; i < len; i++)
anshigh.push_back('0');
ans = Add(anshigh,anslow); //合并结果
if(sign)
ans.push_front('-');
}
return ans;
}
else if(num2.size() == 1 && num1.size() > 1) //如果num2位数大于1,则对Num2分治求积
{
if(*(num1.begin()) == '-')
{
sign = 1;
num1.pop_front();
}
len1 = num1.size();
if(len2 == 1)
{
ans = Mul(num1,num2);
if(sign)
ans.push_front('-');
}
else
{
for(iter= num1.begin(),i = 0; i < len1 / 2; i++,iter++)
{
high.push_back(*iter);
}
for(;iter!=num1.end();iter++)
{
low.push_back(*iter);
}
len = low.size();
anshigh = Mul(num2,high); //num2分为两部分,high,low
anslow = Mul(num2,low);
for(i = 0; i < len; i++)
anshigh.push_back('0');
ans = Add(anshigh,anslow); //合并结果
if(sign)
ans.push_front('-');
}
return ans;
} //如果两数位数都大于1,则都运用分治
else
{
list<char> num1high,num1low,num2high,num2low;
int flag1 = 0,flag2 = 0;
if(*(num1.begin()) == '-')
{
flag1 = 1;
num1.pop_front();
}
if(*(num2.begin()) == '-')
{
flag2 = 1;
num2.pop_front();
}
if((flag1 == 1 && flag2 == 0)||(flag1 == 0 && flag2 == 1)) //如果有一正一负,则标记结果为负
{
sign = 1;
}
len1 = num1.size();
len2 = num2.size();
if(len1 == 1 || len2 == 1) //如果有一个数是一位数,则直接递归调用
{
ans = Mul(num1,num2);
if(sign)
ans.push_front('-');
}
else
{ //否则分治法求
for(iter = num1.begin(),i = 0; i < len1 / 2; iter++,i++)
num1high.push_back(*iter); //被乘数高位部分
for( ; iter != num1.end(); iter++)
num1low.push_back(*iter); //被乘数低位部分
for(iter = num2.begin(),i = 0; i < len2 / 2; iter++,i++)
num2high.push_back(*iter); //乘数高位部分
for( ; iter != num2.end(); iter++)
num2low.push_back(*iter); //乘数低位部分
int a = (len1 + 1) / 2;
int b = (len2 + 1) / 2;
list<char> AC,AD,BC,BD;
//print(num2high);cout << endl;
//print(num2low);cout << endl;
AC = Mul(num1high,num2high); //运用X=A*10^a + B; Y= C*10^b + D;
AD = Mul(num1high,num2low); // X*Y = AC * 10 ^(a+b) + AD *10^a + BC * 10 ^b + BD公式求
BC = Mul(num1low,num2high);
BD = Mul(num1low,num2low);
for(i = 0; i < a + b; i++)
AC.push_back('0');
for(i = 0; i < a; i++)
AD.push_back('0');
for(i = 0; i < b; i++)
BC.push_back('0');
ans = Add(AC,AD);
ans = Add(ans,BC);
ans = Add(ans,BD); //累加结果
if(sign)
ans.push_front('-');
}
return ans;
}
}
还有一种:
#include<iostream>
#include<string>
using namespace std;
int x[50000], y[50000], z[250000000]={0}, p=0;
//数组开到50000,支持50000位乘50000位的算式,代价就是占内存。
int main()
{
string a,b;
cin>>a>>b;//输入因数
for(int i=0; i<a.size(); i++){
x[i] = a[a.size()-i-1]-48;
}
for(int i=0; i<b.size(); i++){
y[i] = b[b.size()-i-1]-48;
}//这两步是把字符串转换成 数字,存在一个数组里。
//这样方便计算,但是如果不转换也可以,只是麻烦一些。
for(int i=0; i<a.size(); i++){
for(int j=0; j<b.size(); j++){
z[i+j] += x[i]*y[j];//将积存在另一个数组里。
while(z[i+j] > 9)
z[i+j]-=10,z[i+j+1]++;//进位
}
}
for(int i=a.size()+b.size()-1; i>=0; i--){ //输出
if(z[i]==0 && p==0 && i!=0)
continue;//判断最高位是否是0,如果是则不输出。
else
p=1;
cout<<z[i];
}
return 0;//最好还是返回一下,养成好习惯。
}