4 条题解

  • -1
    @ 2023-7-18 16:22:03
    /*#include <iostream>
    using namespace std;
    const int Maxn=10;
    int a[Maxn],b[Maxn],c[2*Maxn];
    int lena, lenb, lenc, t;
    int main()
    {
        string s1,s2;
        cin>>s1>>s2;        //s1,s2为十进制字符串值,如:s1=(190)D, s2=(80)D
        lena=s1.length()-1; lenb=s2.length()-1; //lena: 数据a的最高权位,对应数值a实际存储下标:[0..lena]
        lenc=lena+lenb+1;                       //lenc: 相乘后的结果c[]位数是: lena+lenb+1, 也可能是: lena+lenb
        for(int i=0; i<=lena; i++){             //1. 将s1字符串转存入数组a[]中, 考虑到高位可以拓展, 因此最低位放在0位置
            if('0'<=s1[i] and s1[i]<='9') t=s1[i]-48;
            else t=s1[i]-'A'+10;
            a[lena-i]=t;
        }
        for(int i=0; i<=lenb; i++){
            if('0'<=s2[i] and s2[i]<='9') t=s2[i]-48;
            else t=s2[i]-'A'+10;
            b[lenb-i]=t;
        }
        for(int i=0; i<=lena; i++){             //2. 数据a与数据b按对应位置相乘, 权位i与权位j相乘, 其结果累加到数组c[i+j](权位:i+j)中
            for(int j=0; j<=lenb; j++){
                c[i+j]=c[i+j]+a[i]*b[j];
            }
        }
        for(int i=0; i<=lenc; i++){             //3. 将相乘后的结果进行整理,整理成10进制
            c[i+1]+=c[i]/10;
            c[i]%=10;
        }
        while(c[lenc]==0 && lenc>0) lenc--;     //   最高位lenc值可能存在多个0, 将高位无效的0进行消除,(但要确保至少留下1位, 比如:乘以0)
        for(int i=lenc; i>=0; i--){             //4. 从高位到低位, 依次输出高精度数据c[lenc..0]
            printf("%d",c[i]);
        }
        return 0;
    }*/ //高精度乘法;
    
    
    
    
    /*#include <iostream>
    using namespace std;
    const int Maxn=10;
    int a[Maxn],b[Maxn],c[Maxn];
    int lena, lenb, lenc, t;
    int main()
    {
        string s1,s2;
        cin>>s1>>s2;        //s1,s2为十六进制字符串值,如:s1=(B90)H, s2=(80)H
        if(s1.length()<s2.length() or(s1.length()==s2.length() && s1<s2)){ //若s1数据小于s2数据, 则输出"-", 同时进行交换,s1与s2比较最高位字母或数字先后顺序,比较大小;
            cout<<"-";
            swap(s1,s2);
        }
        lena=s1.length()-1; lenb=s2.length()-1; //lena: 数据a的最高权位,对应数值a实际存储下标:[0..lena]
        lenc=lena;                 //lenc: 数据a大于数据b, a-b, 结果c最大可能权位<=lena
        for(int i=0; i<=lena; i++){             //1. 将s1字符串转存入数组a[]中, 考虑到高位可以拓展, 因此最低位放在0位置
            if('0'<=s1[i] and s1[i]<='9') t=s1[i]-48;
            else t=s1[i]-'A'+10;
            a[lena-i]=t;
        }
        for(int i=0; i<=lenb; i++){
            if('0'<=s2[i] and s2[i]<='9') t=s2[i]-48;
            else t=s2[i]-'A'+10;
            b[lenb-i]=t;
        }
        for(int i=0; i<=lenc; i++){             //2. 将数据a与数据b按对应位置相减
            c[i]=a[i]-b[i];
        }
        for(int i=0; i<=lenc; i++){             //3. 将各个位置数据, 从低位到高位, 依次整理成16进制数值(0..15)
            if(c[i]<0){c[i]+=16; c[i+1]--;}     //   整理负数
        }
        while(c[lenc]==0 && lenc>0) lenc--;     //   最高位lenc值可能存储多个0, 将高位无效的0进行消除,(但要确保至少留下1位)
        for(int i=lenc; i>=0; i--){             //4. 从高位到低位, 依次输出高精度数据c[lenc..0]
            if(c[i]>=10){printf("%c",c[i]+55);}
            else{printf("%d",c[i]);}
        }
        return 0;
    }*/ //高精度减法;
    
    
    #include <iostream>
    using namespace std;
    const int Maxn=100;
    int a[Maxn],b[Maxn],c[Maxn];
    int lena, lenb, lenc, t;
    int main()
    {
        string s1,s2;
        cin>>s1>>s2;        //s1,s2为十六进制字符串值,如:s1=(B90)H, s2=(80)H
        lena=s1.length()-1; lenb=s2.length()-1; //lena: 数据a的最高权位,对应数值a实际存储下标:[0..lena]
        lenc=max(lena, lenb)+1;                 //lenc: 数据a+b, 产生结果c的最大可能权位,实际也可能是lenc-1
        for(int i=0; i<=lena; i++){             //1. 将s1字符串转存入数组a[]中, 考虑到高位可以拓展, 因此最低位放在0位置
            if('0'<=s1[i] and s1[i]<='9') t=s1[i]-48;
            else t=s1[i]-'A'+10;
            a[lena-i]=t;
        }
        for(int i=0; i<=lenb; i++){
            if('0'<=s2[i] and s2[i]<='9') t=s2[i]-48;
            else t=s2[i]-'A'+10;
            b[lenb-i]=t;
        }
        for(int i=0; i<=lenc; i++){             //2. 将数据a与数据b按对应位置相加
            c[i]=a[i]+b[i];
        }
        for(int i=0; i<=lenc; i++){             //3. 将各个位置数据, 从低位到高位, 依次整理成16进制数值(0..15)
            c[i+1]+=c[i]/16;
            c[i]%=16;
        }
        if(c[lenc]==0) lenc--;                  //   最高位lenc值为0, 则不存在,进行退位
        for(int i=lenc; i>=0; i--){             //4. 从高位到低位, 依次输出高精度数据c[lenc..0]
            if(c[i]>=10){printf("%c",c[i]+55);}
            else{printf("%d",c[i]);}
        }
        return 0;
    }
    

    信息

    ID
    98
    时间
    1000ms
    内存
    128MiB
    难度
    7
    标签
    递交数
    354
    已通过
    84
    上传者