B3869 题解
题目传送门。
众所周知进制的本质其实就是每一位乘几。例如十进制,,八进制的 。
我们可以假定一个进制系数 ,且设数位共 位,进制为 进制,则 。
可以得到这个 序列。
所以通过这个 序列可以进行进制转换——即将每一位数累加,得到的就是十进制的答案。
详细操作见代码。
#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;
}
一段的本质就是累加其他进制数在十进制中的表示。在十进制转其他进制时,我们在每一位除以 (得到该位的数值),所以在这里计算时要乘回来。
而
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 较为方便。
所以这个题就结束了。

浙公网安备 33010602011771号