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
看这幅漫画(来源于网络),看看能不能理解“进制”的概念?
现在,给定表示数量的符号(这些符号就形成了某种进制),以及该种进制下的两个不超过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;
}
本文来自博客园,作者:Coder-Jiang,转载请注明原文链接:https://www.cnblogs.com/coderjiang/p/18118082
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步