本文已参与[新人创作礼]活动,一起开启掘金创作之路
Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情。
题目描述
这是3月23日代码源div2的每日一题。
知识点:进制转换
进制转换 - 题目 - Daimayuan Online Judge
题面
让我看看是谁不会进制转换,哦原来是我
以不同进制的形式输入 n 个非负整数,求出它们的和并以 m 进制的形式输出。
使用大写字母 A
~ Z
依次代表 10~ 35, 小写字母 a
~ z
依次代表 36 ~ 61。
输入格式
第一行输入两个整数 1≤n≤10, 2≤m≤62
接下来 n 行,每行输入一个整数 2≤t≤62, 一个 t 进制数 0≤x≤10^9。
输出格式
一个 m 进制数,为最终的结果
输入样例1
2 2
2 1
6 10
输出样例1
111
问题分析
先把所有读到的t进制数转换成10进制并计算总和,再把总和转换成m进制。
AC代码
#include<iostream>
using namespace std;
#include<vector>
#include<algorithm>
#include<math.h>
#include<set>
#include<numeric>
#include<string>
#include<string.h>
#include<iterator>
#include<map>
#include<unordered_map>
#include<stack>
#include<list>
#include<queue>
#include<iomanip>
#pragma GCC optimize(1)
#pragma GCC optimize(2)
#pragma GCC optimize(3,"Ofast","inline")
#define endl '\n';
typedef long long ll;
typedef pair<ll, ll>PII;
char v[70];
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(nullptr);
cout.tie(nullptr);
int n, m;
vector<ll>mymap(100);
ll ans = 36;
for (char c = 'a'; c <= 'z'; c++)
{
v[ans] = c;
mymap[c - 65] = ans++;
}
for (char c = '0'; c <= '9'; c++)
v[c - '0'] = c;
ans = 10;
for (char c = 'A'; c <= 'Z'; c++)
{
v[ans] = c;
mymap[c - 65] = ans++;
}
ll sum = 0;
cin >> n >> m;
for (int i = 0; i < n; i++)
{
string s;
int t;
cin >> t >> s;
ans = 1;
int len = s.size();
for (int j = len - 1; j >= 0; j--)
{
if (s[j] >= '0' && s[j] <= '9')sum += (s[j] - '0') * ans;
else sum += mymap[s[j] - 65] * ans;
ans *= t;
}
}
string str;
while (sum)
{
ll num = sum % m;
str += v[num];
sum /= m;
}
reverse(str.begin(), str.end());
cout << str << endl;
return 0;
}