题面

同学们好久不见,自从上学期的程序设计课之后,奶龙现在又有了新的难题,它现在有很多不同进制的非负整数,奶龙想给他们排序却不知道怎么确定数字的大小关系,因此它来向聪明的你求助,也就是说:
给定 n 个非负整数,每个整数都用某种进制表示。
每个数由两部分组成:b s
其中:
b表示进制;s表示该进制下的数字字符串。
进制 b 的范围是 2 到 16。
数字字符串 s 中可能出现:
0 1 2 3 4 5 6 7 8 9 A B C D E F
其中 A 表示十进制的 10,B 表示十进制的 11,依此类推,F 表示十进制的 15。
输入保证每个数字字符串在对应进制下合法。
请你把这 n 个数按照它们的十进制数值从小到大排序。
如果两个数转换成十进制后的数值相等,则需要保持它们在输入中的先后顺序。
注意:数字字符串 s 可能包含前导零。例如:
10 0012
与
10 12
表示的数值相同,都是十进制的 12。
下面给出一份带有 bug 无法通过测试用例的代码,请你修改这份代码的 bug 或者是自己写出完整正确的代码
#include <bits/stdc++.h>
using namespace std;
struct Item {
int base;
string s;
int id;
int value;
};
int convertToDecimal(int base, const string& s) {
int value = 0;
for (char c : s) {
int digit;
if (c >= '0' && c <= '9') {
digit = c - '0';
} else {
digit = c - 'A' + 10;
}
value += digit;
value *= base;
}
return value;
}
bool cmp(const Item& x, const Item& y) {
if (x.value != y.value) {
return x.value < y.value;
}
return x.id > y.id;
}
int main() {
int n;
cin >> n;
vector<Item> a(n);
for (int i = 0; i < n; i++) {
cin >> a[i].base >> a[i].s;
a[i].id = i;
a[i].value = convertToDecimal(a[i].base, a[i].s);
}
sort(a.begin(), a.end(), cmp);
for (auto& item : a) {
cout << item.base << " " << item.s << endl;
}
return 0;
}
输入格式
第一行输入一个整数 n,表示数字个数。
接下来 n 行,每行输入一个整数 b 和一个字符串 s,表示一个 b 进制下的非负整数。
输出格式
按照十进制数值从小到大的顺序输出这 n 个数。
每行输出一个数的原始形式:
b s
如果两个数的十进制数值相同,则按照它们在输入中的顺序输出。
样例
输入
3 16 1 2 111 10 8
输出
16 1 2 111 10 8
提示
输入保证: 在 进制下合法 所有数转换成十进制后的值不超过