B3620 x 进制转 10 进制
ShanCreeperPro · · 题解
B3620 x 进制转 10 进制
最近题库频繁出现这种转换进制的题目,那我就细细讲一下如何将
好耶超多经验!
首先第一个问题:啥是进制?
我们人类现在最经常的使用十进制。
每逢 10 个就进 1 个就是十进制。
比如十个 1 记作 10。十个 10 记作 100。
对于
- 如果
k \leq 10 ,采用的数字为 0 到k-1 。 - 如果
k > 10 ,用完0-9 后,开始用A,B,C,D... 。
例如用十六进制计数:
0 1 2 3 4 5 6 7 8 9 A B C D E F
10 11 12 13 ... 19 1A 1B 1C 1D 1E 1F 20 21 ... FE FF
100 101 102...
讲完进制后,我们还需要知道一个东西:权重。
每个数字都有对应的权重。
在十进制中:
个位权重是 1,十位权重是 10,百位权重是 100...
所以:
- 十进制,逢 10 进十位,100 进百位,1000 进千位;
- k 进制,逢 k 进第二位,
k^2 进百位,k^3 进千位;
那么如何算出
例如:
多练手几道题:
懂得了其中的道理了吧。
所以,我们就可以用上面讲的内容用编程实现
-
读入
x 和字符串S : -
将
S 倒着存入a ,将字母类型变成int。
int charToInt(char c){
if('0'<=c&&c<='9') return c-'0';
return c-'A'+10;
}
int len=S.size();
for(int i=len-1;i>=0;i--) a[len-1-i]=charToInt(S[i]);
- 用我们刚刚讲的权重计算进制公式,第 i 位的贡献是
a_i \times x^i :
int ans=0,w=1;
for(int i=0;i<S.size();i++){
ans+=w*a[i];
w*=x;
}
- w 表示每次的
x^i 。
好的,那么这道题就讲完了,这里是完整代码:
#include <bits/stdc++.h>
using namespace std;
int x, a[105]; // 输入x进制
string S;
// char转数码
int charToInt(char c) {
if('0'<=c&&c<='9') return c-'0';
return c-'A'+10;
}
int main(void) {
cin>>x>>S;
int len=S.size();
for(int i=len-1;i>=0;i--)
a[len-1-i]=charToInt(S[i]);
int ans=0,w=1;
for(int i=0;i<len+1;i++){
ans+=w*a[i];
w*=x;
}
cout<<ans;
return 0;
}