求大佬们救救本蒻笱

P1303 A*B Problem

yizhiyouling @ 2023-12-01 20:58:45

60分,不知道问题出哪了,自己运不过的检查点答案是一样的,大佬们帮忙看看哪有问题。

#include<iostream>
#include<cstring>
#include<cmath> 
using namespace std;
char a[2100],b[2100]/*计算数*/,c[2100],d[2100]/*输入储存*/;
int result[4200],list[4200];//储存结果 
void change(char a[],char b[],int n)    //倒置函数 
{
    for(int i=0;i<n;++i)
        b[i]=a[n-1-i];
    return;
}
void change(int a[],int b[],int n)  //倒置函数 
{
    for(int i=0;i<n;++i)
        b[i]=a[n-1-i];
    return;
}
void myPrint(char a[],int n)    //char类型数组输出 ,方便调试 
{
    for(int i=0;i<n;++i)
        cout<<a[i];
    return; 
}
void myPrint(int a[],int n) //int类型数组输出 ,方便调试 
{
    for(int i=0;i<n;++i)
        cout<<a[i];
    return; 
}
int main()
{
    int m,n,Max;    //记录数位 
    int num,sign;   //记录单个数位上的计算结果以及进位信息 
    cin>>c;
    cin>>d;
    if(c[0]=='0'||d[0]=='0'){
        cout<<"0";
        return 0;
    }
    m=strlen(c);    //计算长度 
    n=strlen(d);
    Max=m+n;
    memset(result,0,sizeof(result));    //初始化计算结果 
    memset(a,'0',sizeof(a));    //初始化计算数组 
    memset(b,'0',sizeof(b));
    change(c,a,m);  //倒置 
    change(d,b,n);
    for(int i=0;i<n;++i){
        sign=0; //每次下一数位运算时重置进位信息 
        for(int j=0;j<m;++j){
            num=(int)(b[i]-'0')*(int)(a[j]-'0')+sign;
            if(num>9){
                sign=num/10;
                num%=10;
            }
            else
                sign=0;
            list[i+j]+=num;
            if(list[i+j]>9){
                sign+=list[i+j]/10;
                list[i+j]%=10;
            }
        }
        if(i==n-1&&sign!=0){
            while(sign){
                num=sign%10;
                list[Max-1]=num;
                sign/=10;
                Max++;
            }    
        }
    }
    change(list,result,Max-1);
    myPrint(result,Max-1);  
    return 0;   
}

by cute_overmind @ 2023-12-01 21:07:57

#include<bits/stdc++.h>
using namespace std;
int a[5005] = {-1};
int main()
{
    int lenn , lenm;
    string n , m;
    cin >> n >> m;
    lenn = n.size();
    lenm = m.size();
    for(int i = lenn - 1;i >- 1;i--)
    {
        for(int j = lenm - 1;j >- 1;j--)
        {
            int a1 = n[i] - '0' + 0;
            int a2 = m[j] - '0' + 0;
            int ji = a1 * a2;
            if(a[lenm + lenn - i - j - 1] == -1)
                a[lenm + lenn - i - j - 1] = ji;
            else 
                a[lenm + lenn - i - j - 1] += ji;
        }
    }
    for(int i = 1;i <= 5000;i++)
    {
        if(a[i] == -1) 
            break;
        if(a[i] >= 9)
        {
            if(a[i + 1] == -1)
                a[i+1]=a[i] / 10;
            else
                a[i + 1] += a[i] / 10;
            a[i] %= 10;
        }
    }
    bool flag = true;
    for(int j = 5000;j >= 1;j--)
    {
        if(a[j] == 0) 
            a[j] =- 1;
        else 
            break;
    } 
    for(int i = 5000;i >= 1;i--)
    {
        if(a[i] != -1)
        {
            cout<<a[i];
            flag = false;
        }
    }
    if(flag)
        cout << 0;
    return 0;
}

本蒟蒻的方法 看看合不合大佬的眼


|