[GESP202309 四级] 进制转换题解

· · 题解

一、核心考点:进制转换,模拟。
二、问题分析:引用题目说明/提示
对于任意一个 L 位 K 进制数,假设其最右边的数位为第 0 位,最左边的数位为第 L−1 位,我们只需要将其第 i 位的数码乘以权值 K i ,再将每位的结果相加,即可得到原 K 进制数对应的十进制数。下面是两个例子:

八进制数 1362 对应的十进制数为:1×8 3 +3×8 2 +6×8 1 +2×8 0 =754;

十六进制数 3F0 对应的十进制数为:3×16 2 +15×16 1 +0×16 0 =1008。。
三、代码实现与解析:

# include <bits/stdc++.h>
using namespace std;
//注意要用用long long类型防止溢出
long long n,k,ans;
//因为可能会有字母用string类型
string s,st;
int main()
{
    cin>>n;
    for(int i=1;i<=n;i++)
    {
        ans=0;
        cin>>k>>s;
        //特判10
        if(k==10)
        {
            cout<<s<<endl;
            continue;
        }
        st=s;
        //将字符倒置,便于操作
        reverse(st.begin(),st.end());
        //10进制以内,没有字母
        if(k<=10)
        {
            for(int j=0;j<st.size();j++)
            {
                //转换成数字
                ans+=(int)(st[j]-'0')*pow(k,j);
            }
        }
        else
        {
            for(int j=0;j<st.size();j++)
            {
                if(st[j]>='A'&&st[j]<='Z')
                {
                    ans+=(int)(st[j]-55)*pow(k,j);
                }
                else ans+=(int)(st[j]-'0')*pow(k,j);
            }
        }
        cout<<ans<<endl; 
    }
    return 0;
}

四、时间复杂度:最外层的循环O(n),转换进制(n(9+9),舍弃常数O(9n)。