P1303老师2019全对我1个AC4个WA

P1303 A*B Problem

HappyDavid @ 2022-08-11 11:58:54

代码

#include <bits/stdc++.h>
using namespace std;

//高精度大数
struct hugeint{
    long long num[10100]={0};//倒序存储具体的数字
    int len=0;//数字的长度
    string s="";
};
//将字符串转成数字  "1234"    4321
hugeint strtoint(string s){
    hugeint ans;
    for(int i=s.size()-1;i>=0;i--){
        ans.num[++ans.len]=s[i]-'0';
    }
    return ans;
}
//打印高精度大数
void printint(hugeint n){
    cout<<n.s;
    for(int i=n.len;i>=1;i--){
        cout<<n.num[i];
    }
    cout<<endl;
}
//比较两个数字大小,如果a>b返回1,如果a<b返回-1,如果a=b返回0
int cmp2(hugeint a,hugeint b){
    //如果数字长度不一样,长的数字比较大
    if(a.len>b.len){
        return 1;
    }
    else if(b.len>a.len){
        return -1;
    }
    else{
        //如果数字长度相同,从高位到低位逐位比较
        for(int i=1;i<=a.len;i++){
            if(a.num[i]>b.num[i]){
                return 1;
            }
            else if(b.num[i]>a.num[i]){
                return -1;
            }
        }
        return 0;

    }
}
//处理前导0
hugeint prelead0(hugeint n){
    while(n.num[n.len]==0 && n.len>1){
        n.len--;
    }
    return n;
}
//高精度+高精度
hugeint add(hugeint a,hugeint b){
    hugeint ans;
    ans.len=max(a.len,b.len);
    //从低位往高位进行运算
    for(int i=1;i<=ans.len;i++){
        ans.num[i]=a.num[i]+b.num[i];//对应位进行加法运算
        ans.num[i+1]=ans.num[i]/10;//更新进位
        ans.num[i]%=10;//将运算结果的个位保存到ans中
    }
    //处理进位溢出
    if(ans.num[ans.len+1]>0){
        ans.len++;
    }
    return ans;
}
//高精度-高精度
hugeint sub(hugeint a,hugeint b){
    hugeint ans;

    //如果a<b,交换它们,标记运算结果
    if(cmp2(a,b)==-1){
        swap(a,b);
        ans.s="-";
    }
    ans.len=a.len;
    //从低位到高位进行运算
    for(int i=1;i<=ans.len;i++){
        ans.num[i]+=a.num[i]-b.num[i];//对应位进行减法运算
        //处理借位
        if(ans.num[i]<0){
            ans.num[i+1]=-1;//更新借位
            ans.num[i]+=10;
        }
    }
    ans=prelead0(ans);//处理前导0
    return ans;
}
//高精度*高精度
hugeint mul(hugeint a,hugeint b){
    hugeint ans;
    ans.len=a.len+b.len-1;
    //从低位往高位进行运算
    for(int i=1;i<=a.len;i++){
        for(int j=1;j<=b.len;j++){
            ans.num[i+j-1]=a.num[i]*b.num[j];//对应位进行乘法运算
            ans.num[i+j]+=ans.num[i+j-1]/10;//更新进位
            ans.num[i+j-1]%=10;//将运算结果的个位保留到ans中
        }
    }
    //处理进位溢出
    if(ans.num[ans.len+1]>0){
        ans.len++;
    }
    ans=prelead0(ans);//处理前导0
    return ans;
}
//高精度/低精度
hugeint div(hugeint a,long long b){
    hugeint ans;
    ans.len=a.len;
    //从高位到低位进行运算
    for(int i=a.len;i>=1;i--){
        ans.num[i]=ans.num[i]/b;//对应位进行除法运算
        a.num[i-1]=a.num[i]%b*10;//处理余数
    }
    ans=prelead0(ans);//处理前导0
    return ans;
}
int plusMAIN(){
    string a,b;
    cin>>a>>b;
    hugeint n1=strtoint(a);
    hugeint n2=strtoint(b);

    printint(add(n1,n2));
    return 0;
}
int minusMAIN(){
    string a,b;
    cin>>a>>b;
    hugeint n1=strtoint(a);
    hugeint n2=strtoint(b);
    printint(sub(n1,n2));
    return 0;
}
int timesMAIN(){
    string a,b;
    cin>>a>>b;
    hugeint n1=strtoint(a);
    hugeint n2=strtoint(b);
    printint(mul(n1,n2));
    return 0;
}
int dividedMAIN(){
    string a;
    long long b;
    cin>>a>>b;
    hugeint n1=strtoint(a);
    printint(div(n1,b));
    return 0;
}
/*

*/
int main()
{
    timesMAIN();
    return 0;
}

提交网址https://www.luogu.com.cn/record/83326197


by HappyDavid @ 2022-08-11 12:00:47

加法贴https://www.luogu.com.cn/discuss/475494 乘法贴https://www.luogu.com.cn/discuss/475550


by UnyieldingTrilobite @ 2022-08-11 12:06:01

#include <bits/stdc++.h>
using namespace std;

//高精度大数
struct hugeint{
    long long num[10100]={0};//倒序存储具体的数字
    int len=0;//数字的长度
    string s="";
};
//将字符串转成数字  "1234"    4321
hugeint strtoint(string s){
    hugeint ans;
    for(int i=s.size()-1;i>=0;i--){
        ans.num[++ans.len]=s[i]-'0';
    }
    return ans;
}
//打印高精度大数
void printint(hugeint n){
    cout<<n.s;
    for(int i=n.len;i>=1;i--){
        cout<<n.num[i];
    }
    cout<<endl;
}
//比较两个数字大小,如果a>b返回1,如果a<b返回-1,如果a=b返回0
int cmp2(hugeint a,hugeint b){
    //如果数字长度不一样,长的数字比较大
    if(a.len>b.len){
        return 1;
    }
    else if(b.len>a.len){
        return -1;
    }
    else{
        //如果数字长度相同,从高位到低位逐位比较
        for(int i=1;i<=a.len;i++){
            if(a.num[i]>b.num[i]){
                return 1;
            }
            else if(b.num[i]>a.num[i]){
                return -1;
            }
        }
        return 0;

    }
}
//处理前导0
hugeint prelead0(hugeint n){
    while(n.num[n.len]==0 && n.len>1){
        n.len--;
    }
    return n;
}
//高精度+高精度
hugeint add(hugeint a,hugeint b){
    hugeint ans;
    ans.len=max(a.len,b.len);
    //从低位往高位进行运算
    for(int i=1;i<=ans.len;i++){
        ans.num[i]=a.num[i]+b.num[i];//对应位进行加法运算
        ans.num[i+1]=ans.num[i]/10;//更新进位
        ans.num[i]%=10;//将运算结果的个位保存到ans中
    }
    //处理进位溢出
    if(ans.num[ans.len+1]>0){
        ans.len++;
    }
    return ans;
}
//高精度-高精度
hugeint sub(hugeint a,hugeint b){
    hugeint ans;

    //如果a<b,交换它们,标记运算结果
    if(cmp2(a,b)==-1){
        swap(a,b);
        ans.s="-";
    }
    ans.len=a.len;
    //从低位到高位进行运算
    for(int i=1;i<=ans.len;i++){
        ans.num[i]+=a.num[i]-b.num[i];//对应位进行减法运算
        //处理借位
        if(ans.num[i]<0){
            ans.num[i+1]=-1;//更新借位
            ans.num[i]+=10;
        }
    }
    ans=prelead0(ans);//处理前导0
    return ans;
}
//高精度*高精度
hugeint mul(hugeint a,hugeint b){
    hugeint ans;
    ans.len=a.len+b.len-1;
    //从低位往高位进行运算
    for(int i=1;i<=a.len;i++){
        for(int j=1;j<=b.len;j++){
            ans.num[i+j-1]+=a.num[i]*b.num[j];//对应位进行乘法运算
            ans.num[i+j]+=ans.num[i+j-1]/10;//更新进位
            ans.num[i+j-1]%=10;//将运算结果的个位保留到ans中
        }
    }
    //处理进位溢出
    if(ans.num[ans.len+1]>0){
        ans.len++;
    }
    ans=prelead0(ans);//处理前导0
    return ans;
}
//高精度/低精度
hugeint div(hugeint a,long long b){
    hugeint ans;
    ans.len=a.len;
    //从高位到低位进行运算
    for(int i=a.len;i>=1;i--){
        ans.num[i]=ans.num[i]/b;//对应位进行除法运算
        a.num[i-1]=a.num[i]%b*10;//处理余数
    }
    ans=prelead0(ans);//处理前导0
    return ans;
}
int plusMAIN(){
    string a,b;
    cin>>a>>b;
    hugeint n1=strtoint(a);
    hugeint n2=strtoint(b);

    printint(add(n1,n2));
    return 0;
}
int minusMAIN(){
    string a,b;
    cin>>a>>b;
    hugeint n1=strtoint(a);
    hugeint n2=strtoint(b);
    printint(sub(n1,n2));
    return 0;
}
int timesMAIN(){
    string a,b;
    cin>>a>>b;
    hugeint n1=strtoint(a);
    hugeint n2=strtoint(b);
    printint(mul(n1,n2));
    return 0;
}
int dividedMAIN(){
    string a;
    long long b;
    cin>>a>>b;
    hugeint n1=strtoint(a);
    printint(div(n1,b));
    return 0;
}
/*

*/
int main()
{
    timesMAIN();
    return 0;
}

老规矩,自己找不同。


by Hoks @ 2022-08-21 09:55:38

为什么要别人帮你找


|