_Persever_ance @ 2024-02-25 19:36:09
#include<stdio.h>
int main()
{
int a[2100] = { 0 }, b[2100] = { 0 }, c[4200] = { 0 };
int c1 = 0, c2 = 0, c3 = 0, i = 0, j = 0, k = 0, max = 0;
char get;
while (1)//顺序输入数据
{
get = getchar();
if (get == '\n')
{
break;
}
a[c1++] = get - '0';//c1为位数
}
while (1)
{
get = getchar();
if (get == '\n')
{
break;
}
b[c2++] = get - '0';
}
for (i = c1-1; i >= 0; i--)//竖式乘法实现,结果逆序输入
{
if (a[i] == 0)
continue;
for (j = c2-1; j >= 0; j--)
{
if (b[j] == 0)
continue;
c3 = c2 - j - 1 + c1 - i - 1;//数字填充的位数
k = a[i] * b[j];
while (k != 0)//进位
{
c[c3] += k % 10;
k /= 10;
max = c3 > max ? c3 : max;
c3++;
}
}
}
for (i = 0; i <= max; i++)//进位
{
if (c[i] >= 10)
{
c3 = i + 1;
k = c[i];
c[i] %= 10;
k /= 10;
while (k != 0)
{
c[c3] += k % 10;
k = k / 10;
max = c3 > max ? c3 : max;
c3++;
}
}
}
for (i = max; i >= 0; i--)//逆序输出
{
printf("%d", c[i]);
}
return 0;
}
by Believe_in_dreams @ 2024-02-25 19:57:18
数据每问题呀,给你份代码,自己去对拍
//高精度乘法
#include<bits/stdc++.h>
using namespace std;
void fan(string &x,int len){//翻转字符串x
for(int i=0;i<=(len-1)/2;i++)swap(x[i],x[len-i-1]);
}
string strcopy(string a,int l,int r){//复制字符串a从l到r的字串
string ret="";
for(int i=l;i<=r;i++)ret+=a[i];
return ret;
}
string qu(string str){
string ret="";
bool infirst=1;
int len=str.size();
for(int i=0;i<len;i++){
if(infirst){
if(str[i]=='0')continue;
infirst=0;
}
ret+=str[i];
}
if(ret=="")ret="0";
return ret;
}
string max(string a,string b){//返回a,b中较大的数
a=qu(a);b=qu(b);
int lena=a.size(),lenb=b.size();
if(lena>lenb)return a;
else if(lenb>lena)return b;
for(int i=0;i<lena;i++){
if(a[i]>b[i])return a;
else if(b[i]>a[i])return b;
}
return a;
}
int max(int a,int b){//整型max
if(a>b)return a;
return b;
}
string mul(string stra,string strb){//高精度乘法
/*
操作流程: 1 4
* 1 2 3
---------
? ? ?
1.循环枚举并相乘 0 0 3*1*10 3*4*1
0 2*1*100 2*4*10
1*1*1000 1*4*100 0 0
2.相加 3*1*10+3*4*1+2*1*100+2*4*10+1*1*1000+1*4*100=1722
3.判0+返回 1 4
* 1 2 3
------------
1 7 2 2
*/
int a[1001],b[1001],ans[2001];//数组储存,防止爆char
int lena=stra.size(),lenb=strb.size(),len=lena+lenb;//获取字符串长度
for(int i=0;i<lena;i++)a[i+1]=stra[i]-'0';//转移到数组
for(int i=0;i<lenb;i++)b[i+1]=strb[i]-'0';//转移到数组
memset(ans,0,sizeof ans);//清空ans数组
for(int i=1;i<=lena;i++){//枚举数位相乘
for(int j=1;j<=lenb;j++){//枚举数位相乘
int qz=lena-i+lenb-j+1;//计算权值
ans[qz]+=a[i]*b[j];
ans[qz+1]+=(ans[qz]/10);//进位
ans[qz]%=10;//进位
}
}
for(int i=1;i<len;i++){//再次处理进位
ans[i+1]+=ans[i]/10;//进位
ans[i]%=10;//进位
}
string ret="";//返回的字符串
bool infirst=1;//用于去除前导零
for(int i=len;i>=1;i--){
if(infirst){
if(ans[i]==0)continue;//前导零不输出
infirst=0;//后面的都输出
}
ret+=(ans[i]+'0');//加入到输出的字符串中
}
if(ret=="")ret="0";//判0
return ret;
}
int main(){
string a,b;
cin>>a>>b;
cout<<mul(a,b);
return 0;
}
by Chenjunyu2010 @ 2024-02-25 20:37:04
#include<stdio.h>
#include <string>
#include <iostream>
using namespace std;
int main()
{
int a[2100] = { 0 }, b[2100] = { 0 }, c[4200] = { 0 };
int c1 = 0, c2 = 0, c3 = 0, i = 0, j = 0, k = 0, max = 0;
string a1,b1;
cin >> a1 >> b1;
for(int i=0;i<a1.size();i++) {
a[c1++]=a1[i]-'0';
}
for(int i=0;i<b1.size();i++) {
b[c2++]=b1[i]-'0';
}
for (i = c1-1; i >= 0; i--)//竖式乘法实现,结果逆序输入
{
if (a[i] == 0)
continue;
for (j = c2-1; j >= 0; j--)
{
if (b[j] == 0)
continue;
c3 = c2 - j - 1 + c1 - i - 1;//数字填充的位数
k = a[i] * b[j];
while (k != 0)//进位
{
c[c3] += k % 10;
k /= 10;
max = c3 > max ? c3 : max;
c3++;
}
}
}
for (i = 0; i <= max; i++)//进位
{
if (c[i] >= 10)
{
c3 = i + 1;
k = c[i];
c[i] %= 10;
k /= 10;
while (k != 0)
{
c[c3] += k % 10;
k = k / 10;
max = c3 > max ? c3 : max;
c3++;
}
}
}
for (i = max; i >= 0; i--)//逆序输出
{
printf("%d", c[i]);
}
return 0;
}
by _Persever_ance @ 2024-02-25 20:44:45
@Chenjunyu2010 是输入数据方式的问题吗
by Chenjunyu2010 @ 2024-02-25 20:46:36
我不知道(我也是个蒟蒻),感觉怪怪的,我用C++写就过了,可能是吧
by chen13535281510 @ 2024-02-29 15:28:01
用python3逝逝
by SereneMaizi_ @ 2024-03-03 11:47:44
那个啥,我直接a*b简单明了的AC了,你们为什么想这么复杂啊??(思索
by a13805065538 @ 2024-05-13 21:59:44
@_Persever_ance 对啊