B3869 题解

题目传送门

众所周知进制的本质其实就是每一位乘几。例如十进制,114514=1×105+1×104+4×103+5×102+1×101+4×100114514=1\times10^5+1\times10^4+4\times10^3+5\times10^2+1\times10^1+4\times10^0,八进制的 345=3×82+4×81+5×80345=3\times8^2+4\times8^1+5\times8^0

我们可以假定一个进制系数 pp,且设数位共 ll 位,进制为 nn 进制,则 pl=1,pl1=pl×n=n,pi=pi+1×np_l=1,p_{l-1}=p_l\times n=n,p_i=p_{i+1}\times n

可以得到这个 pp 序列。

所以通过这个 pp 序列可以进行进制转换——即将每一位数累加,得到的就是十进制的答案。

详细操作见代码。

#include<bits/stdc++.h>
using namespace std;
map<char,int>mp;
string s;
int T,n;
long long _=1;
int main(){
	mp['0']=0;mp['1']=1;mp['2']=2;mp['3']=3;mp['4']=4;mp['5']=5;mp['6']=6;
	mp['7']=7;mp['8']=8;mp['9']=9;mp['A']=10;mp['B']=11;mp['C']=12;mp['D']=13;
	mp['E']=14;mp['F']=15;
	cin>>T;
	while(T--){
		cin>>n>>s;
		long long ans=0;
		_=1;
		for(int i=s.length()-1;i>=0;i--){
			ans=ans+_*mp[s[i]];
			_*=n;
		}
		cout<<ans<<endl;
	}
	return 0;
}

其中

long long ans=0;
_=1;
for(int i=s.length()-1;i>=0;i--){
	ans=ans+_*mp[s[i]];
	_*=n;
}

一段的本质就是累加其他进制数在十进制中的表示。在十进制转其他进制时,我们在每一位除以 nn(得到该位的数值),所以在这里计算时要乘回来。

mp['0']=0;mp['1']=1;mp['2']=2;mp['3']=3;mp['4']=4;mp['5']=5;mp['6']=6;
mp['7']=7;mp['8']=8;mp['9']=9;mp['A']=10;mp['B']=11;mp['C']=12;mp['D']=13;
mp['E']=14;mp['F']=15;

段使用了 map,可以方便快捷地将字符转换为数字。平时我们有字符换数字的公式,但是因为这里出现了大写字母,所以使用 map 较为方便。

所以这个题就结束了。

posted @   Weslie_qwq  阅读(7)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示