代码源:612、进制转换

204 阅读1分钟

本文已参与[新人创作礼]活动,一起开启掘金创作之路 logo.png

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;
}