欢迎光临散文网 会员登陆 & 注册

P1604 B进制星球

2023-03-17 17:15 作者:仓鼠翞  | 我要投稿

//高精度B进制加法
//B属于二到36
//每行一个B进制数正整数。数字的每一位属于{0,1,2,3,4,5,6,7,8,9,A,B……},每个数字长度<=2000位。
#include<bits/stdc++.h>
using namespace std;
string x,y;
int a[10000],b[10000],c[10000],la,lb,lc;//申明全局变量是自动设置为全零
int B;
int main() {
   cin >> B;
   cin >> x >> y;
   la = x.length();
   lb = y.length();
   for (int i = 0; i < la; i++)
   {
       //需要判断是数字则减去零的ASCII值是字母要减去A的ASCII值
       //注意有一个很重要的问题:如果一个字符的ascii值是大写字母的ascii值那么他也一定大于数字字符的ascii值
       //字符字母的ascii值是大于字符数字的ascii值的
       if (x[i] >='A' && x[i] <= 'Z')
       {
           a[la - i] = x[i] - 'A' + 10;//B进制中十代表的是A
       }
       else
           a[la - i] = x[i] - '0';
   }
   for (int i = 0; i < lb; i++)
   {
       if (y[i] >= 'A' && y[i] <= 'Z')
       {
           b[lb - i] = y[i] - 'A' + 10;
       }
       else
           b[lb - i] = y[i] - '0';
   }
   //B进制加法
   //结果的最大长度?
   //考虑最极端的二进制加法:1111+11111=101110即四位数加五位数最多就是六位数
   lc = max(la, lb);
   for (int i = 1; i <= lc; i++) {
       c[i] += a[i] + b[i];
       c[i + 1] += c[i] / B;//处理进位信息
       c[i] = c[i] % B;//计算本位
   }
   //加法可能会导致位数增加由上面的二进制加法可知
   if(c[lc+1]>0) lc++;
   for (int i = lc; i >= 1; i--)
   {
       //别忘了输出也有问题如果输出的是一个大于十的数字
       if(c[i]>=10)
       {
           printf("%c",c[i]+'A'-10);
       }
       else
       {
           printf("%c",c[i]+'0');
       }
   }
   return 0;
}

P1604 B进制星球的评论 (共 条)

分享到微博请遵守国家法律