B3620 x 进制转 10 进制

· · 题解

B3620 x 进制转 10 进制

最近题库频繁出现这种转换进制的题目,那我就细细讲一下如何将 x 进制转换成 10 进制。

好耶超多经验!

首先第一个问题:啥是进制?

我们人类现在最经常的使用十进制。

逢 10 个就进 1 个就是十进制。

比如十个 1 记作 10。十个 10 记作 100。

对于 k 进制:

例如用十六进制计数:

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...

(678)_{10} = 6 \times 100 + 7 \times 10 + 8 \times 1

所以:

那么如何算出 k 进制数字的 10 进制数字?

例如:

(12341)_5 = 1 \times 5^4 + 2 \times 5^3 + 3 \times 5^2 + 4 \times 5 + 1 = 971 = (971)_{10}

多练手几道题:

(123)_7 = 1 \times 7^2 + 2 \times 7 + 3 = 49 + 14 + 3 = 66 (1000)_2 = 1 \times 2^3 + 0 + 0 + 0 = 8 (654)_8 = 6 \times 8^2 + 5 \times 8 + 4 = 6 \times 64 + 40 + 4 = 428

懂得了其中的道理了吧。

所以,我们就可以用上面讲的内容用编程实现 x 进制转 10 进制。

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]);
int ans=0,w=1;
for(int i=0;i<S.size();i++){
    ans+=w*a[i];
    w*=x;
}

好的,那么这道题就讲完了,这里是完整代码:

#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;
}