听取WA声一片(悬关求助)

P1303 A*B Problem

K_func @ 2024-02-01 14:55:31

#include <bits/stdc++.h>
using namespace std;
struct Hugeint{
    int len,digits[32768];
    Hugeint(int x = 0){
        memset(digits,0,sizeof(digits));
        for(len = 1;x;len++){
            digits[len] = x%10;
            x/=10;
        }
        len--;
    }
    int &operator[](int i){
        return digits[i];
    }
    void carry(int l){
        len = l;
        for(int i=1;i<=len;i++){
            digits[i+1]+=digits[i]/10,digits[i]%=10;
        }
        for(;!digits[len];){
            len--;
        }
    }
    void output(){
        for(int i=max(len,1);i>=1;i--){
            printf("%d",digits[i]);
        }
    }
    Hugeint operator+(Hugeint num){
        Hugeint temp;
        len = max(num.len,len);
        for(int i=1;i<=len;i++){
            temp[i]+=num[i]+digits[i];
        }
        temp.carry(len+1);
        return temp;
    }
    Hugeint operator*(Hugeint num){
        Hugeint tmp;
        for(int i=1;i<=num.len;i++){
            for(int j=1;j<=len;j++){
                tmp[i+j] += num[i]*digits[j];
            }
        }
        int lent = num.len+len;
        tmp.carry(lent);
        for(;lent>=1&&!tmp[lent-1];){
            lent--;
        }
        tmp.len = lent;
        return tmp;
    }
};
string ca,cb;
Hugeint a,b,ans;
int main(){
    cin>>ca>>cb;
    for(int i=0;i<ca.size();i++){
        a[i+1] = ca[i]-'0';
    }
    for(int i=0;i<cb.size();i++){
        b[i+1] = cb[i]-'0';
    }
    (a*b).output();
}

by jiguanlin @ 2024-02-06 23:31:15

@ Jadejunxi 我熬夜爆肝送你高精度乘法模版,自己记好,不懂可以问我。

#include<bits/stdc++.h>
using namespace std;
string s1,s2;//定义字符串 
int a[5010],b[5010],c[500010];//数组存储 
int l1,l2,l;//定义变量储存长度 
int main(){
    cin >> s1 >> s2;//字符串输入 
    l1=s1.size(),l2=s2.size();//长度赋值 
    l=l1+l2;//总长度 
    for(int i=0;i<l1;i++) a[i]=s1[l1-i-1]-'0';//字符串1逆序存储到a列表 
    for(int i=0;i<l2;i++) b[i]=s2[l2-i-1]-'0';//字符串2逆序存储到b列表
    for(int i=0;i<l1;i++){//两层循环,分别遍历a数组和b数组 
        for(int j=0;j<l2;j++){
            c[i+j]+=a[i]*b[j];//计算当前这位 
            c[i+j+1]+=c[i+j]/10;//进位 
            c[i+j]%=10;//只保留个位 
        }
    }
    while(c[l]==0&&l!=0) l--;//去前导 0 
    for(int i=l;i>=0;i--) cout << c[i];//逆序输出 
    return 0;
}

其实我也是个蒟蒻……

私信我,交个朋友吧!


by jiguanlin @ 2024-02-06 23:32:00

这个可以AC的


by jiguanlin @ 2024-02-12 21:18:46

收到回复我一声


by jinxihexi_ @ 2024-02-14 23:22:19

@jiguanlin 为什么是5010而不是2010呢?


by jiguanlin @ 2024-02-17 21:58:10

@jinxihexi_当然2010也可以


|