caozhihan @ 2024-08-31 11:33:27
高精度乘法模板题。
给出两个非负整数,求它们的乘积。
输入共两行,每行一个非负整数。
输出一个非负整数表示乘积。
1
2
2
每个非负整数不超过
#include <bits/stdc++.h>
using namespace std;
string PLUS (string,string);
int main()
{
string x,y,sum="",mstr;
int a[500001],b[500001],c[1000001],t[500001],m[500001],i,j,l,k,lena,lenb,len,lent,lenm,p=0;
cin>>x;
cin>>y;
for(i=0;i<x.size();i++) a[i+1]=x[i]-'0';
for(j=0;j<y.size();j++) b[j+1]=y[j]-'0';
lena=i;lenb=j;
len=max(lena,lenb);
if(lena<lenb)
{
for(i=1;i<=lena;i++)
{
t[i]=a[i];
}
for(i=1;i<=lenb;i++)
{
a[i]=b[i];
}
for(i=1;i<=lena;i++)
{
b[i]=t[i];
}
lent=lena;
lena=lenb;
lenb=lent;
}
if(lena<len)
{
l=len;
a[len]=a[lena];
a[lena]=0;
for(k=lena-1;k>=1;k--)
{
a[l-1]=a[k];
a[k]=0;
l--;
}
}
if(lenb<len)
{
l=len;
b[len]=b[lenb];
b[lenb]=0;
for(k=lenb-1;k>=1;k--)
{
b[l-1]=b[k];
b[k]=0;
l--;
}
}
bool z;
for(i=len;i>=1;i--)
{
lenm=len;
mstr="";
z=false;
if(b[i]==0) mstr="0";
else
{
for(j=len;j>=1;j--)
{
m[j]=b[i]*a[j]+p;
p=0;
p=m[j]/10;
m[j]%=10;
}
if(p>0)
{
mstr=char(p+'0');
z=true;
}
for(k=1;k<=lenm;k++)
{
if(z||m[k]!=0) mstr+=char(m[k]+'0');
}
for(l=1;l<=len-i;l++)
{
mstr+="0";
}
sum=PLUS(sum,mstr);
}
}
z=false;
for(i=0;i<sum.size();i++)
{
if(sum[i]!=0||z)
{
cout<<sum[i];
z=true;
}
}
if(!z) cout<<0;
return 0;
}
string PLUS (string x,string y)
{
string ans;
int a[5001],b[5001],c[5001];
int i,j,k,l,p=0,len;
for(i=0;i<x.size();i++) a[i+1]=x[i]-'0';
for(j=0;j<y.size();j++) b[j+1]=y[j]-'0';
len=max(i,j);
if(i<len)
{
l=len;
a[len]=a[i];
a[i]=0;
for(k=i-1;k>=1;k--)
{
a[l-1]=a[k];
a[k]=0;
l--;
}
}
if(j<len)
{
l=len;
b[len]=b[j];
b[j]=0;
for(k=j-1;k>=1;k--)
{
b[l-1]=b[k];
b[k]=0;
l--;
}
}
for(i=len;i>=1;i--)
{
c[i]=a[i]+b[i]+p;
p=0;
if(c[i]>=10)
{
p=1;
c[i]%=10;
}
}
bool z=false;
if(p==1)
{
ans+="1";
}
for(i=1;i<=len;i++)
{
if(z||c[i]!=0)
{
ans+=char(c[i]+'0');
z=true;
}
}
if(!z) ans+="0";
return ans;
}
by zjr2014 @ 2024-08-31 11:38:16
#include<bits/stdc++.h>
using namespace std;
int a[1000001]={0},alen,b[1000001]={0},blen,c[1000001]={0},clen;
string x,y;
int main(){
cin>>x>>y;
for(int i=0;i<x.size();i++){
a[x.size()-i]=x[i]-'0';
alen++;
}
for(int i=0;i<y.size();i++){
b[y.size()-i]=y[i]-'0';
blen++;
}
for(int i=1;i<=alen;i++){
for(int j=1;j<=blen;j++){
c[i+j-1]+=a[i]*b[j];
c[i+j]+=c[i+j-1]/10;
c[i+j-1]%=10;
}
}
clen=alen+blen-1;
if(c[alen+blen]!=0){
clen++;
}
for(int i=clen;i>=2;i--){
if(c[i]==0){
clen--;
}
else{
break;
}
}
for(int i=clen;i>=1;i--){
cout<<c[i];
}
return 0;
}
by 枫原万叶 @ 2024-08-31 11:41:42
@caozhihan 建议用python
from decimal import *
import sys
setcontext(Context(prec=2000000, Emax=2000000, Emin=0))
print((Decimal(sys.stdin.readline())*Decimal(sys.stdin.readline())))
by fu1013 @ 2024-10-15 21:43:14
python一行水过
print(int(input())*int(input()))
如果要用c++的话那么看下面的模版
#include <bits/stdc++.h>
using namespace std;
int a[2001],b[2001],c[4002];
char a1[2001],b1[2001];
int main(){
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cin>>a1>>b1;
int i = 0;
int la = strlen(a1);
int lb = strlen(b1);
for (i = 0; i < la; i++)a[la - 1 - i] = a1[i] - 48;
for (i = 0; i < lb; i++)b[lb - 1 - i] = b1[i] - 48;
int m = la + lb ;
for (int i = 0; i < la; i++) {
for (int j = 0; j < lb; j++) {
c[i + j] += a[i] * b[j];
}
}
for (int i = 0; i < m; i++) {
c[i + 1] += c[i] / 10;
c[i] %= 10;
}
while (c[m] == 0 && m >= 1)m--;
for (i = m; i >= 0; i--){
cout<<c[i];
}
return 0;
}