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

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

22小时前

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


原创内容 转载请注明出处

分享给朋友:

相关文章

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

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

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

手把手教你实现进制转换(C++代码注释+小白友好教程)

一、简介和特点进制转换是编程中常见的操作,即将数值从一种进制(如十进制)转换为另一种进制(如二进制、十六进制等)。本代码实现了一个通用的进制转换工具,具有以下特点:   ...

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

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

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

2023年GESP四级小杨的字典(洛谷B3927)解题报告:基于哈希表的字符串替换优化

2023年GESP四级小杨的字典(洛谷B3927)解题报告:基于哈希表的字符串替换优化

一、题目解读题目要求实现一个“字典替换”功能:给定一个字典(键值对映射)和一段文本,将文本中出现的字典中的单词替换为其对应的值,未匹配的单词用“UNK”代替。需处理标点符号分隔单词,并确保输入异常情况...

洛谷2652题解析:同花顺排序问题的动态规划与滑动窗口优化

洛谷2652题解析:同花顺排序问题的动态规划与滑动窗口优化

一、题目解读洛谷2652题要求对一组扑克牌进行排序,目标是找到最少需要调整的次数,使得所有牌形成同花顺。题目中,扑克牌由花色和数字组成,需先按花色排序,再在同花色内按数字排序。核心难点在于如何处理花色...

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

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

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

发表评论

访客

看不清,换一张

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