求助大佬!为什么自己尝试可以而提交就不行了呢?

P1303 A*B Problem

123456789qaz @ 2022-05-27 16:23:27

每次自己测试都可以,为啥交上去就有问题了

望大佬回复!

#include<iostream>
#include<math.h>
#include<cstring>
using namespace std;
int a[4000];
int b[4000];
int c[8000];
int ak,bk;
string ain;
string bin;
void cheng(){
    //cout<<ak<<endl<<bk<<endl;
    for(int i=0;i<ak;i++){
        for(int j=0;j<bk;j++){
            c[i+j]+=a[i]*b[j];
            //cout<<i<<' '<<j<<' '<<c[i+j]<<endl;
        }
    }
    return ;
} 
void up(){
    for(int i=0;i<ak+bk+1;i++){
        c[i]=c[i]%10;
        c[i+1]+=c[i]/10;
    }
}
void out(){
    bool is0=true;
    for(int i=ak+bk+1;i>=0;i--){
        if(is0){
            if(c[i]!=0){
                cout<<c[i];
                is0=false;
            }
        }
        else{
            cout<<c[i];
        }
    }
}
void in(){

    cin>>ain>>bin;
    ak=ain.length();
    bk=bin.length();
    for(int i=0;i<ak;i++){
        a[i]=ain[ak-i-1]-'0';
    }
    for(int i=0;i<bk;i++){
        b[i]=bin[bk-i-1]-'0';
    }

}
int main(){

    memset(a,0,sizeof(a));
    memset(b,0,sizeof(b));
    memset(c,0,sizeof(c));
    //cout<<"请输入两个乘数"<<endl; 
    in();
    if(ain=="0" || bin=="0"){
        cout<<'0';
        return 0;
    }
    //cout<<"solve in"<<endl;
    //for(int i=0;i<ak;i++){
        //cout<<a[i];
    //}
    //cout<<endl;
    //for(int i=0;i<bk;i++){
        //cout<<b[i];
    //}
    //cout<<endl;
    cheng();
    //cout<<endl<<"solve multiplication"<<endl;
    up();
    //cout<<"solve up"<<endl;
    //cout<<"OK! Answer is:";
    out();
    //cout<<endl<<"Thank for using!"<<endl;
    return 0;
}

by Terrible @ 2022-05-27 18:10:13

@123456789qaz

你这个进位的时候不对,顺序错了,是先进位,再对本位取余。即c[i+1]+=c[i]/10;c[i]=c[i]%10;

你如果用不太可能造成进位的数据去测试的话,那么它几乎是对的。

你可以在你原本的程序中试试 999999999999\times999999999999=999999999998000000000001


by 123456789qaz @ 2022-05-28 10:24:07

@Terrible

刚刚尝试了一下,AC了,是因为先求余导致c[i]发生变化导致错误吗?在此万分感谢大佬!


|