求助!只有第一位正确,AC二点

P1303 A*B Problem

洛必达法则 @ 2024-09-08 11:59:47

    const int Base=1000000000;//进位制
    const int Width=9;//每一位的输出宽度

    vector<int> arr;//按位数值阵列

    BigNum(long long num=0) {*this=num;}//构造函数
    BigNum operator * (BigNum& B)//乘法
    {
        BigNum x;
        x.arr.clear();
        long long g(0);
        for(long long i=0;;i++)
        {
            if(i>=this->size()&&i>=B.size()) break;
            long long opt=1;
            if(i<this->size()) opt*=arr[i];
            if(i<B.size()) opt*=B.arr[i];
            opt+=g;//包含进位数目
            x.arr.push_back(opt%Base);//录入
            g=opt/Base;//记录进位数目
        }
        while(g!=0)
        {
            x.arr.push_back(g%Base);
            g/=Base;
        }
        return x;
    }
    BigNum operator *= (BigNum& B)//累乘
    {
        *this=*this*B;
        return *this;
    }

rt


by 洛必达法则 @ 2024-09-08 12:00:27

有省略,只保留核心部分


by BJ_BSGF_Lyc @ 2024-09-08 12:11:55

减 ASCII 差值即可:

int init(int a[],string &s){
    cin>>s;
    int len=s.size();
    for(int i=0;i<len;i++) a[i]=s[len-1-i]-'0';
    return len;
} //主要运算函数
int lenA,lenB,lenC;
void Mul(){
    for(int i=0;i<lenB;i++){
        int m=0;
        for(int j=0;j<lenA;j++){
            C[i+j]=A[j]*B[i]+m+C[i+j];
            m=C[i+j]/10;
            C[i+j]=C[i+j]%10;
        }
    C[lenA+i]=m;
    }
} //位值原理,除位迭代
int main(){
    lenA=init(A,s1);
    lenB=init(B,s2);
    int lenC=lenA+lenB;
    Mul();
    while(C[lenC]==0&&lenC>0)
        lenC--;
    for(int i=lenC;i>=0;i--)
        cout<<C[i];
    return 0; //收工
}

by BJ_BSGF_Lyc @ 2024-09-08 12:12:21

@洛必达法则 pls 壶关 QAQ。


by atcoder001 @ 2024-09-08 12:37:26

qp


by 洛必达法则 @ 2024-09-08 13:03:24

@BJ_BSGF_Lyc ??哪有ascii差值


by BJ_BSGF_Lyc @ 2024-09-08 13:04:35

@洛必达法则 哦哦,就是位值原理+强转(sorry)


by 洛必达法则 @ 2024-09-08 13:05:47

哦哦哦哦才发现我错得离谱QAQ 太感谢了


by BJ_BSGF_Lyc @ 2024-09-08 13:06:25

@洛必达法则 你这个写法我头一次见,不过先%%%%%%


by BJ_BSGF_Lyc @ 2024-09-08 13:07:12

@洛必达法则 已互


|