P1604 B进制星球

本题长度超过正常范围,所以无法通过转十进制计算再转回。

模拟数学竖式计算,逢十进一变成逢B进一(高精度加法)。

#include <bits/stdc++.h>
using namespace std;
int B;
string a,b,c;
int num[128]={};
char sig[128]={};
void init(){
    for(int i='0';i<='9';i++) num[i]=i-'0';
    for(int i='A';i<='Z';i++) num[i]=i-'A'+10;
    for(int i=0;i<=9;i++) sig[i]='0'+i;
    for(int i=10;i<36;i++) sig[i]='A'+i-10;
}
int main(){
    init(); // 初始化
    cin>>B;
    cin>>a>>b;
    int jw=0;
    for(int i=a.size()-1,j=b.size()-1;i>=0||j>=0;i--,j--){
        if(i<0) a[i=0]='0';
        if(j<0) b[j=0]='0';
        int t=num[a[i]]+num[b[j]]+jw;
        jw=t/B;
        c+=sig[t%B];
    }
    if(jw) c+=to_string(jw);
    while(c.back()=='0'&&c.size()>1) c.resize(c.size()-1);
    reverse(c.begin(),c.end());
    cout<<c;
}