1 条题解

  • 0
    @ 2025-8-24 21:13:59

    自动搬运

    查看原文

    来自洛谷,原作者为

    avatar ShanCreeperPro
    DILL QQTeam:746219450

    搬运于2025-08-24 21:13:58,当前版本为作者最后更新于2022-03-24 22:12:27,作者可能在搬运后再次修改,您可在原文处查看最新版

    自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多

    以下是正文


    B3620 x 进制转 10 进制

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

    好耶超多经验!

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

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

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

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


    对于 kk 进制:

    • 如果 k10k \leq 10,采用的数字为 0 到 k1k-1
    • 如果 k>10k > 10,用完 090-9 后,开始用 A,B,C,D...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...

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

    所以:

    • 十进制,逢 10 进十位,100 进百位,1000 进千位;
    • k 进制,逢 k 进第二位,k2k^2 进百位,k3k^3 进千位;

    那么如何算出 kk 进制数字的 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×23+0+0+0=8(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 $$

    懂得了其中的道理了吧。


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

    • 读入 xx 和字符串 SS

    • SS 倒着存入 aa,将字母类型变成 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 位的贡献是 ai×xia_i \times x^i
    int ans=0,w=1;
    for(int i=0;i<S.size();i++){
    	ans+=w*a[i];
        w*=x;
    }
    
    • w 表示每次的 xix^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;
    }
    
    • 1

    信息

    ID
    7589
    时间
    1000ms
    内存
    128MiB
    难度
    2
    标签
    递交数
    0
    已通过
    0
    上传者