1 条题解

  • 0
    @ 2025-8-24 21:15:37

    自动搬运

    查看原文

    来自洛谷,原作者为

    avatar VirtualPoint
    已经退役,现在是游戏玩家 || 关注CuteCaviar的GUY可以得到我的关注。

    搬运于2025-08-24 21:15:36,当前版本为作者最后更新于2024-03-13 14:15:09,作者可能在搬运后再次修改,您可在原文处查看最新版

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

    以下是正文


    声明(也就是废话)

    • 一审打回,感谢一审管理员Jiyuu_no_Tsubasa的审核。
    • 二审打回,感谢二审管理员swiftc的审核。
    • 这是本蒟蒻的第一篇题解,激动不已。三审管理员求过~
    • 代码请需要的同学谨慎使用。切勿抄题解!这是非常不道德的行为。而且,这还可能导致又一位作弊者的产生。

    题目大意

    输入 nn 个整数与其进制 kk,对于每一个整数,我们求它得十进制并输出。

    分析

    相信大家早就发现了,题目良心得给出了转换方法!
    这里放上原文:

    “对于任意一个 LLKK 进制数,假设其最右边的数位为第 00 位,最左边的数位为第 L1L-1 位,我们只需要将其第 i 位的数码乘以权值 KiK^i,再将每位的结果相加,即可得到原 KK 进制数对应的十进制数。”

    什么意思呢?

    这里涉及到一个概念:位权。

    什么是位权呢?我们拿一个十进制数 114514114514 举例:

    类型 十万位 万位 千位 百位 十位 个位
    数字 11 44 55 11 44
    位权 10510^5 10410^4 10310^3 10210^2 10110^1 10010^0
    计算过程 105×110^{5} \times 1 104×110^{4} \times 1 103×410^{3} \times 4 102×510^{2} \times 5 101×110^{1} \times 1 100×410^{0} \times 4
    实际数值 100000100000 1000010000 40004000 500500 1010 44

    114514114514 就是每一位代表的实际数值之和。

    相信大家有思路了吧!第 nn 位的位权,就代表这一位上每一个 11 代表的数量。

    这是十进制中的位权。但如果这个 114514114514 是八进制数呢?

    类型 十万位 万位 千位 百位 十位 个位
    数字 11 44 55 11 44
    位权 858^5 848^4 838^3 828^2 818^1 808^0
    计算过程 85×18^{5} \times 1 84×18^{4} \times 1 83×48^{3} \times 4 82×58^{2} \times 5 81×18^{1} \times 1 80×48^{0} \times 4
    实际数值 3276832768 40964096 20482048 320320 88 44

    这几个数值加起来,刚好就是八进制数 114514114514 的十进制形式 3924439244

    着手实现

    看到这里,相信大家都明白怎么写代码了吧!但是还有几个易错点我要讲一讲。

    • string

    如果你想用 int 类型输入,随后用 while 循环拆分数位累加的话,那你可就大错特错了。虽然用这种方式拆分数位又快又好用,但是你想过没有,int 类型似乎不支持除了 1~10 以外的数字输入啊!

    而这些数字(包括但不限于 A)可是 11~16 以及更多进制的命根子!

    我们只能用 string 来实现。当然,如果你学有余力,不妨挑战一下字符数组?

    • long long

    正所谓那句老话:

    “十年 OI 一场空,不开 long long 见祖宗!”

    我们可以想一下,如果题目输入十六进制数 FFFFFFFFF\text{FFFFFFFFF} 怎么办?这个数非常大,会把 int 类型撑爆!就算是 long 类型也很危险!

    只能开 long long 了对吧?

    当然,如果题目数据再大一点,我们就不得不用到 __int128 了。

    代码

    #include <iostream>
    #include <cmath>
    using namespace std;
    
    long long n;
    
    long long k;
    
    long long num[15];
    
    string snum;
    
    int main() {
        cin >> n;//处理输入
    
        while (n--) {
            cin >> k >> snum;//处理输入
    
            long long ans = 0;
    
            for (long long i = 0; i < snum.size(); i++) {
                if (!(snum[i] >= '0' && snum[i] <= '9')) {
                    num[i] = snum[i]-'A'+10;
                } else {
                    num[i] = snum[i]-'0';
                }
                ans = ans * k + num[i];
              //我们可以直接在处理字符的时候直接进行累加。
              //当然,更直接的做法就是不要num数组,直接处理完后累加。
            }
    
            cout << ans << endl;//记得输出!
        }
        return 0;
    }
    

    大家看看,AC的非常漂亮是不是?

    • 1

    信息

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