题目描述
给一个小整数 x 和一个 x 进制的数 S。将 S 转为 10 进制数。对于超过十进制的数码,用 A
,B
,…… 表示。
输入格式
第一行一个整数 x;
第二行一个字符串 S。
输出格式
输出仅包含一个整数,表示答案。
输入输出样例
输入 #1
16 7B
输出 #1
123
说明/提示
【数据规模和约定】
保证目标数在十进制下不超过 109,1≤x≤36。
思路
我们人类现在最经常的使用十进制。
每逢 10 进 1 就是十进制。
对于 x 进制:
如果 x≤10,采用的数字为 0 到 −1。
如果 xk>10,用完 0−9 后,开始用 A,B,C,D...
讲完进制后,我们还需要知道一个东西:权重。
每个数字都有对应的权重。
在十进制中:个位权重是 1,十位权重是 10,百位权重是 100...
所以:
十进制,逢 10 进十位,100 进百位,1000 进千位
x 进制,逢 x 进第二位,x2 进百位,x3 进千位;
那么如何算出 x进制数字的 10 进制数字?
例如:
(1000)2=1×23+0+0+0=8(1000)2=1×23+0+0+0=8
(654)8=6×82+5×8+4=6×64+40+4=428(654)8=6×82+5×8+4=6×64+40+4=428
所以,我们就可以用上面讲的内容用编程实现 x 进制转 10 进制。
将 S 倒着存入 a,将字母类型变成 int
。
用我们刚刚讲的权重计算进制公式,第 i 位的贡献是 ai*xi:
w 表示每次的 xi。
#include<bits/stdc++.h>
using namespace std;
int x,a[105];
string s;
int h(char c)
{
if('0'<=c&&c<='9')return c-'0';
return c-'A'+10;
}
int main(void)
{
cin>>x>>s;
int e=s.size();
for(int i=e-1;i>=0;i--)a[e-1-i]=h(s[i]);
int p=0,w=1;
for(int i=0;i<e+1;i++)
{
p+=w*a[i];
w*=x;
}
cout<<p;
return 0;
}
如有错误,欢迎大家评论区指出!感谢!