[GESP202309 四级] 进制转换题解
weizehao20131117 · · 题解
一、核心考点:进制转换,模拟。
二、问题分析:引用题目说明/提示
对于任意一个 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)。