专栏文章

[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 进制数对应的十进制数。下面是两个例子:
八进制数 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 条评论,欢迎与作者交流。

正在加载评论...