L1-8 N进制高精度加法

到底应该怎样理解进制呢?首先得有“一个”的数量概念,然后就是这样的:
把用来表示数量的符号依次排列,例如: q w e r
然后定义最前面的符号为“零”,即“没有”,后面的符号表示的数量依次比前一个符号多“一个”
进制就这样产生了: 例如当我们数数,依次数到 q w e r ,再往后数一个,符号不够用了,那么就写成 wq
并且,我们把这种进制命名为“wq”进制。
感觉怪异吗? 那么请换成我们熟悉的所谓“10”进制看看:
我们的用于表示数量的符号依次是: 0 1 2 3 4 5 6 7 8 9 , 当数到9,再往后数“一个”时,就数到了 10
看这幅漫画(来源于网络),看看能不能理解“进制”的概念?

 base10.jpg
现在,给定表示数量的符号(这些符号就形成了某种进制),以及该种进制下的两个不超过100位的正整数,请计算两数之和。

输入格式:

第一行给定表示数量的符号,每个符号为一个字符、各不相同且中间没有空格,最多有30个符号且符号的可能范围是:数字 0-9、大小写字母、!@#$%^&*()
接下来两行每行给出一个该进制下的不超过100位的正整数

输出格式:

在一行中输出该进制下的两数之和。

输入样例1:

0123456789
123
12

输出样例1:

135

输入样例2:

abcd
bcd
bc

输出样例2:

cab

 思路:

想象成是实现加法运算,只不过把0~29表示成字符而已

比较坑的一点就是例如有9999+1,那么结果应该是10000,但是很容易跳坑算成了0000忽略了最高位的1

参考代码:

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

string symbols;

// 字符转换成数字,以便完成相加、进位检测等操作
int charToInt(char ch) {
    for(int i=0;i<symbols.size();++i) {
        if(symbols[i] == ch) return i;
    }
    return -1;
}

// 将数字转换为字符
char intToChar(int index) {
    return symbols[index%symbols.size()];
}

// 两字符相加函数,返回字符
char add(char ch1, char ch2, bool up) {
    return intToChar(charToInt(ch1) + charToInt(ch2) + up);
}

// 检测两字符相加的话是否需要进一位
bool isUp(char ch1, char ch2, bool up) {
    return charToInt(ch1) + charToInt(ch2) + up >= symbols.size();
}

int main() {
    cin>>symbols;
    string n1, n2;
    cin>>n1>>n2;
    reverse(n1.begin(), n1.end());
    reverse(n2.begin(), n2.end());
    string res;
    int index = 0;
    bool up = false;
    for(;index < n1.size() && index < n2.size(); ++index) {
        res.push_back(add(n1[index], n2[index], up));
        up = isUp(n1[index], n2[index], up);
    }
    string& rest = index<n1.size()?n1:n2;
    while(index < rest.size()) {
        res.push_back(add(rest[index], symbols[0], up));
        up = isUp(rest[index], symbols[0], up);
        index++;
    }
    // 针对99+1的情况,最高位还需要进1
    if(up) {
        res.push_back(symbols[1]);
    }
    reverse(res.begin(), res.end());
    cout<<res;
    return 0;
}

 

posted @   Coder-Jiang  阅读(40)  评论(0编辑  收藏  举报  
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起