抱歉,您的浏览器无法访问本站
本页面需要浏览器支持(启用)JavaScript
了解详情 >

原题

今天第一次刷CodeForces,随便找了个题。

原题链接

要求实现2到36进制的累加,输出与输入进制相同。

第一行输入数字个数n

第二行输入进制。

后面n行输入累加的数字。

思考

这道题核心是实现两个数任意进制的加法。

因为带有字母,所以用string存储数字是个不错选择。

既然都用string存储了,干脆用高精度加法的思路做题吧。

假设我们要将ab相加。

首先将ab倒序存储,方便进位。

然后判断ab哪个长度较短,避免越界。

每一位都转换为数字加在一起,看需不需要进位。

如果需要进位用flag标记一下。

因为加法中进位只可能进1位,所以flag可以是bool节省一点点空间。

具体见注释吧。

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>

using namespace std;

string baseChar = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"; //便于将数字直接转成进制的字符
int base; //进制

string addString(string a, string b) //高精度加法
{
string res;
int alen = a.size(), blen = b.size();
if (alen > blen) swap(a, b), swap(alen, blen); //保证a长度一定小于b
int i = 0;
int sum;
int numa, numb;
bool flag = false;
while (i != alen) { //先一直操作直到a的末尾
//将a,b对应位上的数字或字符转成数字
numa = isalpha(a[i]) ? a[i] - 'A' + 10 : a[i] - '0';
numb = isalpha(b[i]) ? b[i] - 'A' + 10 : b[i] - '0';
//sum存储当前位相加结果
sum = numa + numb + flag;
//进位结束了,恢复flag状态
flag = false;
res.push_back(baseChar[sum % base]); //将结果存进res中
if (sum >= base) { //需要进位
flag = true;
}
++i;
}
//把剩下b的数字加进去
while (i != blen) {
numb = isalpha(b[i]) ? b[i] - 'A' + 10 : b[i] - '0';
//记得处理可能出现的进位
sum = numb + flag;
flag = false;
res.push_back(baseChar[sum % base]);
if (sum >= base) flag = true;
++i;
}
//b也结束了,但还需要进一位的话就进
if (flag) res.push_back('1');
return res;
}

string addFunc(vector<string>& a) //实现累加
{
string res = a[0];
int len = a.size();
for (int i = 1; i < len; i++) {
res = addString(res, a[i]);
}
reverse(res.begin(), res.end()); //res是倒序的,反转一下
return res;
}

int main()
{
ios::sync_with_stdio(false); //关闭流同步大大提高cin效率
int w;
cin >> w;
cin >> base;
string str;
vector<string> a;
int i = 0;
while (w--) {
cin >> str;
int len = str.size();
while (i < len && str[i] == '0') ++i; //删去前导零
if (i) str.substr(i);
i = 0;
reverse(str.begin(), str.end()); //倒序存储
a.push_back(str);
}
cout << addFunc(a);
return 0;
}

最后

感觉string在函数间拷贝来拷贝去的有点占用时间,还能继续优化一下。

不懂语言Factor是什么,最后没能提交上去,没测试能不能AC。

评论