专栏文章
[GESP202309 四级] 进制转换题解
题解参与者 1已保存评论 0
文章操作
快速查看文章及其快照的属性,并进行相关操作。
- 当前评论
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @minu9kad
- 此快照首次捕获于
- 2025/12/02 08:27 3 个月前
- 此快照最后确认于
- 2025/12/02 08:27 3 个月前
一、核心考点:进制转换,模拟。
二、问题分析:引用题目说明/提示
对于任意一个 L 位 K 进制数,假设其最右边的数位为第 0 位,最左边的数位为第 L−1 位,我们只需要将其第 i 位的数码乘以权值 K i ,再将每位的结果相加,即可得到原 K 进制数对应的十进制数。下面是两个例子:
二、问题分析:引用题目说明/提示
对于任意一个 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。。
三、代码实现与解析:
CPP三、代码实现与解析:
# 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(9*n)。
相关推荐
评论
共 0 条评论,欢迎与作者交流。
正在加载评论...