求教,看了好久,不觉得有错,谢谢

P1303 A*B Problem

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的情况不会出现

希望我的回答对你有所帮助


|