当前位置:首页 > GESP > 洛谷B3869题:位权法实现K进制转十进制

洛谷B3869题:位权法实现K进制转十进制

1个月前 (08-14)

洛谷B3869题:位权法实现K进制转十进制 洛谷题解 进制转换 进制转换算法 GESP GESP四级 迭代 第1张

一、题目解读

洛谷B3869题目要求将输入的K进制数(2≤K≤16)转换为对应的十进制数值。用户需处理多组数据,每组包含进制K和K进制字符串,输出转换结果。题目考察进制转换的基本原理与算法实现,需确保对字符到数值的映射及权重计算的准确性。

二、解题思路

核心思路为“位权法”,即通过逐位解析K进制数的字符,将其映射为数值(0-15),并结合当前位的权重(k^(length-1-i))累加求和。关键在于设计字符转换函数(charToValue)与权重计算逻辑,避免复杂幂运算,通过循环迭代实现高效转换。

三、解题步骤

1. 输入处理:循环读取N组数据,每组解析K与num字符串。

2. 字符转换:通过charToValue函数将字符(‘0’-‘9’或‘A’-‘F’)转换为对应数值(0-15),非法字符返回-1(但题目保证不会出现)。

3. 权重计算:从右到左遍历num,每位权重为k^(length-1-i),通过result *= k + value迭代累加,避免递归或指数计算。

4. 输出结果:每组转换后的十进制数值单独输出。

四、代码与注释

#include <iostream>
#include <string>
#include <cmath>
using namespace std;

// 将字符转换为对应的数值(0-15)
int charToValue(char c) {
    if (c >= '0' && c <= '9') return c - '0'; // 数字字符直接映射
    if (c >= 'A' && c <= 'F') return 10 + (c - 'A'); // 字母字符映射为10-15
    return -1; // 非法字符(题目保证不会出现)
}

// 将K进制字符串转换为十进制数
long long kToDecimal(const string& num, int k) {
    long long result = 0;
    int length = num.length();
    
    for (int i = 0; i < length; ++i) {
        int value = charToValue(num[i]); // 获取当前字符数值
        // 计算当前位的权重:k^(length-1-i)
        result = result * k + value; // 更高效的计算方式(避免幂运算)
    }
    
    return result;
}

int main() {
    ios::sync_with_stdio(false); // 加快输入/输出
    cin.tie(nullptr);
    
    int N;
    cin >> N;
    
    for (int i = 0; i < N; ++i) {
        int K;
        string num;
        cin >> K >> num;
        
        cout << kToDecimal(num, K) << "\n"; // 输出转换结果
    }
    
    return 0;
}

五、总结

本解法通过位权法实现了K进制到十进制的线性时间转换,关键在于字符映射与权重迭代计算的优化。代码简洁高效,避免了复杂数学库依赖,适用于竞赛及实际开发中的进制转换场景。理解位权法的逻辑对掌握进制转换算法至关重要,建议结合实例调试以加深理解。


原创内容 转载请注明出处

分享给朋友:

相关文章

2024年GESP四级宝箱题(洛谷P4006)题解:滑动窗口算法优化最长子序列和

2024年GESP四级宝箱题(洛谷P4006)题解:滑动窗口算法优化最长子序列和

一、题目解读本题为2024年GESP四级中的“宝箱”问题(对应洛谷P4006),要求在一个由n个宝箱组成的序列中,找出一个连续子序列,使得该子序列中宝箱价值之和最大,且子序列中最大值与最小值的差不超过...

2023年GESP四级田忌赛马算法解析(洛谷B3928)— C++双指针策略与代码详解

2023年GESP四级田忌赛马算法解析(洛谷B3928)— C++双指针策略与代码详解

一、题目解读“田忌赛马”源自中国古代典故,田忌通过策略性安排马匹对阵顺序,以弱马对阵强马、强马对阵弱马的方式,实现整体胜利。在算法竞赛中,该问题通常转化为:给定两方马匹的战斗力数组,如何通过对阵策略最...

洛谷1656题解:基于Tarjan算法求解割边问题(附代码与详细步骤)

洛谷1656题解:基于Tarjan算法求解割边问题(附代码与详细步骤)

一、题目解读洛谷1656题要求在无向图中找出所有割边(即删除后导致图不连通的边)。题目核心在于判断图的连通性,并识别哪些边是“桥”。需理解图论中的连通分量概念,以及如何通过算法高效定位割边。二、解题思...

洛谷P1121题解:动态规划求解环形数组最大子段和问题(附代码注释)

洛谷P1121题解:动态规划求解环形数组最大子段和问题(附代码注释)

一、题目解读洛谷P1121题要求求解环形数组的最大子段和,即在一个环形数组中找到一个连续子段,使其元素和最大。环形数组的特殊性在于首尾元素可相连,需考虑线性子段与跨越首尾的环形子段两种情况。二、解题思...

力扣面试题02.05链表相加:虚拟头节点+迭代解法的详细解析

力扣面试题02.05链表相加:虚拟头节点+迭代解法的详细解析

一、题目解读力扣面试题02.05要求将两个链表表示的整数相加,每个节点存储一位数字(逆序),结果同样以链表形式返回。例如,链表1为7→2→4,链表2为5→6→3,相加结果应为2→9→8→7。题目难点在...

洛谷P1141题解:迷宫连通块问题的深度优先搜索算法与代码解析

洛谷P1141题解:迷宫连通块问题的深度优先搜索算法与代码解析

一、题目解读洛谷P1141题目要求处理一个由字符构成的迷宫,其中相同字符形成连通块,不同字符构成分隔。题目需统计连通块数量及大小,并支持查询两点是否属于同一连通块。核心在于高效识别并标记迷宫中的连通区...

发表评论

访客

看不清,换一张

◎欢迎参与讨论,请在这里发表您的看法和观点。