自己输入算的都对,一提交都错,求助

P1303 A*B Problem

_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 对啊


|