题目

小f来到了璃月和须弥交接处的层岩巨渊。层岩巨渊是璃月的领土,曾经作为璃月最重要的矿场,有着悠久的历史。但是在近期,这里却因为怪事频发导致大多数工人暂时离开。

在这里,小f遇到了一种奇特的机关。这种机关旁边刻了两个数字 a, b,小f通过询问当地人得知,想要通过这个机关需要将 a 转换为 b 进制数。这可难不倒小f,他十分快速地得到答案,输入了进去,但是机关却发出了刺耳的鸣叫。很显然小f的答案不对,请你帮他得出正确的答案,他会将机关后的珍宝分你一半。

在 16 进制中,我们用 A 表示 10,B 表示 11。以此类推,可知道在 36 进制中 Z 表示 35。

输入:两个十进制数字 a, b。
输出:一个数,表示 a 在 b 进制下的数。
数据范围:1 ≤ a ≤ 10000,1 ≤ b ≤ 36。
注意:处理 0。

样例:

输入

123 25

输出

4N

思路

不断 a % b 取余数、a /= b 更新,余数即为各位数字(低位先出)。用字符串 "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ" 做映射表,余数直接作下标取字符,拼到结果字符串末尾,最后 reverse 反转即为答案。

C++ · p79.cpp
#include<bits/stdc++.h>
using namespace std;

string convert(int a, int b){
    string digits = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    string rever="";
    while(a!=0){
        rever+=digits[a%b];
        a/=b;
    }
    reverse(rever.begin(),rever.end());
    return rever;
}

int main(){
    int a,b;
    cin>>a>>b;
    cout<<convert(a,b)<<endl;
    return 0;
}

复杂度分析

  • 时间复杂度:O(logb a),循环次数为 a 在 b 进制下的位数。
  • 空间复杂度:O(logb a),存储结果字符串。
今日感受

进制转换和十进制反序是同一套逻辑:不断取余、除以基数。关键是用一个映射字符串 "0123…Z" 代替手写数字和字母的判断,余数直接作下标,干净利落。余数是从低位到高位产生的,最后反转字符串即可。

← 返回菜鸟的coding