[保研/考研机试] KY80 进制转换 北京大学复试上机题 C++实现

题目链接:

KY80 进制转换https://www.nowcoder.com/share/jump/437195121691735660774

描述

写出一个程序,接受一个十六进制的数值字符串,输出该数值的十进制字符串(注意可能存在的一个测试用例里的多组数据)。

输入描述:

输入一个十六进制的数值字符串。

输出描述:

输出该数值的十进制字符串。

示例1

输入:

cpp 复制代码
0xA

输出:

cpp 复制代码
10

思路:

  1. 读入十六进制数值字符串 s。

  2. 初始化结果字符串 res 为 "0",表示最终的十进制结果。

  3. 从字符串的第三位开始遍历,即从十六进制数值的有效部分开始,因为前两位为 "0x" 表示十六进制前缀。

  4. 在遍历过程中,先将结果字符串 res 乘以 16,相当于将十六进制数值左移 4 位。

  5. 再将当前字符代表的值加到结果字符串 res 中,通过调用 Add 函数实现。

  6. 输出最终的十进制结果。

源代码:

cpp 复制代码
#include <iostream>
#include <string>
using namespace std;

// 将十六进制字符转换为对应的整数
int CharToInt(char c) {
    if (c >= '0' && c <= '9') {
        return c - '0';  // 数字字符直接转换
    } else {
        return c - 'A' + 10;  // 字母字符转换,a 对应 10,b 对应 11,依此类推
    }
}

// 将字符串表示的十六进制数与整数 x 相乘
string multiple(string str, int x) {
    int carry = 0;  // 进位
    string result;  // 存放结果
    for (int i = str.size() - 1; i >= 0; i--) {
        int current = x * CharToInt(str[i]) + carry; // 计算当前位的结果
        result = char(current % 10 + '0') + result;  // 将当前位的结果插入到结果的前面
        carry = current / 10;  // 更新进位
    }
    while (carry != 0) {
        result = char(carry % 10 + '0') + result;  // 处理剩余的进位
        carry /= 10;
    }
    return result;
}

// 将字符串表示的十六进制数与整数 x 相加
string Add(string str, int x) {
    int carry = x;  // 初始进位为 x
    string result;  // 存放结果
    for (int i = str.size() - 1; i >= 0; i--) {
        int current = CharToInt(str[i]) + carry; // 计算当前位的结果
        result = char(current % 10 + '0') + result;  // 将当前位的结果插入到结果的前面
        carry = current / 10;  // 更新进位
    }
    while (carry != 0) {
        result = char(carry % 10 + '0') + result;  // 处理剩余的进位
        carry /= 10;
    }
    return result;
}

int main() {
    string s;
    while (cin >> s) {
        string res = "0";  // 初始化结果为0
        for (int i = 2; i < s.size(); i++) {
            res = multiple(res, 16);  // 乘以16,相当于左移4位
            res = Add(res, CharToInt(s[i]));  // 加上当前字符代表的值
        }
        cout << res << endl;  // 输出最终结果
    }

    return 0;
}

提交结果:

编辑切换为居中

添加图片注释,不超过 140 字(可选)

相关推荐
!停几秒前
C++入门基础
java·开发语言·c++
承渊政道2 分钟前
C++学习之旅【智能指针的使⽤及其原理】
开发语言·c++·笔记·vscode·学习·visual studio
一叶落4386 分钟前
LeetCode 380. O(1) 时间插入、删除和获取随机元素【哈希表 + 动态数组 | C语言详解】
c语言·数据结构·c++·算法·leetcode·散列表
sycmancia6 分钟前
C++——类模板的概念和意义
c++
xiaoye-duck7 分钟前
《算法题讲解指南:递归,搜索与回溯算法--二叉树中的深搜》--8.二叉树剪枝,9.验证二叉搜索树
c++·算法·深度优先·递归
承渊政道8 分钟前
C++学习之旅【异常相关内容以及类型转换介绍】
c语言·c++·笔记·vscode·学习·macos·visual studio
liulilittle9 分钟前
Debian/Ubuntu 18.04 上安装 GLIBC 2.28 (2026)
linux·运维·服务器·开发语言·c++·ubuntu·debian
承渊政道16 分钟前
C++学习之旅【深入回溯C++11的发展历程】
c语言·c++·笔记·vscode·学习·macos·visual studio
xiaoye-duck9 小时前
《算法题讲解指南:递归,搜索与回溯算法--递归》--3.反转链表,4.两两交换链表中的节点,5.快速幂
数据结构·c++·算法·递归
山栀shanzhi9 小时前
归并排序(Merge Sort)原理与实现
数据结构·c++·算法·排序算法