thliup @ 2023-12-22 20:46:08
#include<iostream>
#include<iomanip>
#include<cmath>
#include<algorithm>
#include<stdbool.h>
#include<stdio.h>
#include<cstring>
using namespace std;
#define M 10000
char a[M], b[M];
int c[M], d[M],e[M];
int main() {
cin >> a >> b;
int len = strlen(a), len1 = strlen(b);
for (int i = 0; i < len; i++) {
c[len-i]=a[i] -'0';
}for (int i = 0; i < len1; i++) {
d[len1-i]=b[i] -'0';
}
for (int i = 0; i < len; i++) {
for (int j = 0; j < len1; j++) {
e[i + j] += c[i] * d[j];
if (e[i + j] >= 10){
e[i + j + 1] += e[i + j] / 10;
e[i + j] %= 10;
}
}
}
int w = len + len1;
while (!e[w] ) {
w--;
}
for (int i = w; i >= 0; i--) {
cout << e[i];
}
return 0;
}
by naoliaok_lovely @ 2023-12-22 20:54:36
你开小罢?
by hyb123bc @ 2023-12-22 21:51:39
#include<iostream>
#include<iomanip>
#include<cmath>
#include<algorithm>
#include<stdbool.h>
#include<stdio.h>
#include<cstring>
using namespace std;
string a,b;
int c[5010],d[5010],e[5010];
int main()
{
cin>>a>>b;
int len=a.size();
int len1=b.size();
int w = len + len1;
for (int i = 0; i < len;i++)
{
c[len-i-1]=a[i] -'0';
}
for (int i = 0; i < len1; i++)
{
d[len1-i-1]=b[i] -'0';
}
for (int i = 0; i < len; i++)
{
for (int j = 0; j < len1; j++)
{
e[i+j]+=c[i]*d[j];
}
}
for(int i=0;i<w;i++)
{
e[i+1]+=e[i]/10;
e[i]%=10;
}
if(e[w]==0)
{
w--;
}
while(e[w-1]==0&&w>1)
{
w--;
}
for (int i=w-1;i>=0;i--)
{
cout<<e[i];
}
return 0;
}
by jiangsixian @ 2023-12-22 21:57:28
其实你可以用python
a = input()
b = input()
print(a * b)
如果选用C++来做这道题,高精度是不可避免的 (当然不排除我没见过世面)
而高精度的宗旨,就在于用竖式来模拟各种运算,比如这里的模拟乘法竖式
核心思路就是:先用数组装下每个数,然后模拟每一位乘法,用一个答案数组存储每一位乘法后得到的结果(不需要处理进位),最后处理进位(逢十进一)
AC代码如下:
#include<iostream>
#include<cstring>
using namespace std;
char a1[50001],b1[50001];
int a[50001],b[50001],i,x,len,j,c[50001];
int main ()
{
cin >>a1 >>b1;//读入两个数
a[0]=strlen(a1);b[0]=strlen(b1);//计算长度
for (i=1;i<=a[0];++i)
a[i]=a1[a[0]-i]-'0';//将字符串转换成数字 动手写写过程就知道了
for (i=1;i<=b[0];++i)
b[i]=b1[b[0]-i]-'0';
for (i=1;i<=a[0];++i)
for (j=1;j<=b[0];++j)
c[i+j-1]+=a[i]*b[j];//按乘法
len=a[0]+b[0]; //原理进行高精乘
for (i=1;i<len;++i)
if (c[i]>9)
{c[i+1]+=c[i]/10;c[i]%=10;}//进位
while (c[len]==0&&len>1)len--;//判断位数
for (i=len;i>=1;--i)cout <<c[i];//输出
return 0;
}
by hyb123bc @ 2023-12-22 22:01:29
1.string转int时是c[len-i-1]
2.去前导零时,至少留一位,而且是e[w-1],例如:
000008
while(e[w]==0){w--;} 最后w=0; 再把w那一位单独判断
3.我建议把相乘和进位分开写,便于检查。
by Rose_Oierup69 @ 2024-01-06 23:16:15
你的错法和我的一样
是不是只有第一个测试点没过,然后别的都过了,然后怎么改都还是只有80分
错误点:在删去前导零时,存在当积是0时,会使lenc=0的情况,结果就是啥都输不出来,answer too short on line 1
正确写法:while(!c[lenc]]&&lenc>1) c[0]--; 使得lenc等于0的情况不会出现
希望我的回答对你有所帮助