【例3】高精度乘法。输入两个正整数,求它们的积。
1.13编程基础之综合应用 09:大整数乘法
【问题描述】
贝贝是学校信息学编程小组的学生,一天,他的数学老师碰到这样一个问题:他想求两个很长的数的乘积,但用普通的计算器无法完成计算,于是他请编程班的贝贝帮忙设计一个“超级计算器”,解决他所遇到的问题。
请你编一程序,帮贝贝解决这个问题。
【输入格式】
两行,分别是两个在10100以内的自然数。
【输出格式】
两数相乘的结果。
【输入样例】
578474357954668
12435124571
【输出样例】
7193400702295541350947428
C++参考代码一:
#include<iostream>
#include<cstring>
#include<cstdio>
char a1[1001],b1[1001];
//string a,b,c;
int a[1001],b[1001],c[1001];
using namespace std;
int main( void )
{
int lena,lenb,lenc,i,j,x;
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
memset(c,0,sizeof(c));
cin>>a1>>b1;
//gets(a1);
//gets(b1);
lena=strlen(a1);
lenb=strlen(b1);
//123 321
for (i=0;i<=lena-1;i++)
{
a[lena-i]=a1[i]-48;
//a[lena-i]=a1[i]-'0';
}
for (i=0;i<=lenb-1;i++)
{
b[lenb-i]=b1[i]-48;//'0'
}
for (i=1;i<=lena;i++)
{
//用于存放进位
x=0;
//对乘数的每一位进行处理
for (j=1;j<=lenb;j++)
{
//当前乘积+上次乘积进位+原数
c[i+j-1]=a[i]*b[j]+x+c[i+j-1];
x=c[i+j-1]/10;
c[i+j-1]%=10;
}
//进位
c[i+lenb]=x;
}
lenc=lena+lenb;
//删除前导0
while (c[lenc]==0 && lenc>1)
{
lenc--;
}
for (i=lenc;i>=1;i--)
{
cout<<c[i];
}
//cout<<endl;
return 0;
}
C++参考代码二:
//program p5_04
/*
1307:【例1.3】高精度乘法 AC
http://ybt.ssoier.cn:8088/problem_show.php?pid=1307
*/
#include <bits/stdc++.h>
using namespace std;
const int maxL=200+90;
string s;
int lena,lenb,lenc;
int a[maxL],b[maxL],c[maxL];
void multiply(int a[],int lenax,int b[],int lenbx,int c[],int& lencx)
{
memset(c,0,sizeof(c));
lencx=lenax+lenbx;
for(int i=0;i<lenax;++i)
for(int j=0;j<lenbx;++j)
{
int w=i+j;
c[w]+=a[i]*b[j];//此处有问题
//向前进位
c[w+1]+=c[w]/10;
//cout<<"w1="<<w<<" "<<c[w]<<" "<<c[w+1]<<" "<<w+1<<endl;
//向前进一位之后余下的数
c[w]%=10;
//cout<<"w2="<<w<<" "<<c[w]<<endl;
//cout<<"----------------------------"<<endl;
}
//去掉前导0
while( lencx>1 && c[lencx-1] == 0 ) --lencx;
}
int main( void )
{
cin>>s;
lena=s.length();
//倒序
for(int i=0;i<lena;++i)
{
a[i]=s[lena-1-i]-'0';
}
cin>>s;
lenb=s.length();
//倒序
for(int i=0;i<lenb;++i)
{
b[i]=s[lenb-1-i]-'0';
}
multiply(a,lena,b,lenb,c,lenc);
for(int i=lenc-1;i>=0;--i)
{
cout<<c[i];
}
cout<<endl;
return 0;
}
/*
作业:
1174:大整数乘法
http://ybt.ssoier.cn:8088/problem_show.php?pid=1174
NOIP 2011 普及组初赛试题完善程序 4.2 大整数开方
NOIP 2011 提高组初赛试题完善程序 5.1 大整数开方
https://blog.csdn.net/cool99781/article/details/115642719
*/
1168:大整数加法
1.6编程基础之一维数组_10大整数加法
1169:大整数减法
1.6编程基础之一维数组_11大整数减法
1.6编程基础之一维数组_12计算2的N次方
1.6编程基础之一维数组_13大整数的因子
1.6编程基础之一维数组_14求10000以内n的阶乘
1.6编程基础之一维数组_15阶乘和
【例 1.6】回文数(Noip1999)
NOIP2003 普及组 第 4 题 P1045 麦森数(分治、高精度运算)
NOIP2005 普及组 第 4 题 P1050 循环(高精度运算、数论、快速幂)
1307:【例1.3】高精度乘法
1308:【例1.5】高精除
1309:【例1.6】回文数(Noip1999)
1170:计算2的N次方
1171:大整数的因子
1172:求10000以内n的阶乘
1173:阶乘和
1174:大整数乘法
1175:除以13