[保研/考研机试] KY26 10进制 VS 2进制 清华大学复试上机题 C++实现

题目链接:

10进制 VS 2进制http://www.nowcoder.com/share/jump/437195121691738172415

描述

对于一个十进制数A,将A转换为二进制数,然后按位逆序排列,再转换为十进制数B,我们称B为A的二进制逆序数。 例如对于十进制数173,它的二进制形式为10101101,逆序排列得到10110101,其十进制数为181,181即为173的二进制逆序数。

输入描述:

一个1000位(即10^999)以内的十进制数。

输出描述:

输入的十进制数的二进制逆序数。

示例1

输入:

复制代码
173

输出:

复制代码
181

思路:

  1. 输入一个十进制数 s
  2. 使用大整数除法函数 divides 不断除以 2,得到二进制数的各个位,存放在向量 binary 中,顺序是按位逆序排列的。
  3. 初始化一个字符串 res 为 "0",用于存放最终的结果。
  4. 遍历 binary 中的每一位,将 res 乘以 2(相当于左移一位),然后加上当前位的值,得到二进制逆序数的十进制表示。
  5. 输出最终的二进制逆序数。

注意:代码中使用了字符串来表示大整数,通过模拟除法、乘法和加法操作,实现了对二进制逆序数的计算和转换。

源代码:

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

// 例题6.3 KY26 10进制 VS 2进制 

// 字符串表示的大整数除法
string divide(string str, int x) {
    int reminder = 0;  // 余数
    for (int i = 0; i < str.size(); i++) {
        int current = reminder * 10 + str[i] - '0';  // 当前位的数值
        str[i] = current / x + '0';  // 更新当前位的值为商的字符表示
        reminder = current % x;  // 更新余数
    }
    int pos = 0;
    while (str[pos] == '0') {
        pos++;  // 移除前导零
    }
    return str.substr(pos);  // 返回除法结果,移除前导零
}

string multiple(string str, int x) {
    int carry = 0;  // 进位
    for (int i = str.size() - 1; i >= 0; i--) {
        int current = x * (str[i] - '0') + carry;  // 当前位的计算结果
        str[i] = current % 10 + '0';  // 更新当前位的值为计算结果的个位
        carry = current / 10;  // 更新进位
    }
    if (carry != 0) {
        str = "1" + str;  // 处理最终的进位
    }
    return str;
}

string Add(string str, int x) {
    int carry = x;  // 初始进位为 x
    for (int i = str.size() - 1; i >= 0; i--) {
        int current = (str[i] - '0') + carry;  // 当前位的计算结果
        str[i] = current % 10 + '0';  // 更新当前位的值为计算结果的个位
        carry = current / 10;  // 更新进位
    }
    if (carry != 0) {
        str = "1" + str;  // 处理最终的进位
    }
    return str;
}

int main() {
    string s;
    cin >> s;  // 输入十进制数
    vector<int> binary;  // 用于存放二进制逆序的每一位
    while (s.size() != 0) {
        int last = s[s.size() - 1] - '0';  // 取最后一位
        binary.push_back(last % 2);  // 将最后一位的余数(二进制的最低位)存入 vector
        s = divide(s, 2);  // 将十进制数除以 2,得到下一轮迭代的数值
    }

    // 将得到的 binary 中的按位逆序排列的二进制数转换为十进制数
    string res = "0";  // 初始化结果为 0
    for (int i = 0; i < binary.size(); i++) {
        res = multiple(res, 2);  // 将结果乘以 2,相当于左移一位
        res = Add(res, binary[i]);  // 加上当前位的值
    }
    cout << res << endl;  // 输出最终的二进制逆序数
   
    return 0;
}

提交结果:

相关推荐
SweetCode3 分钟前
裴蜀定理:整数解的奥秘
数据结构·python·线性代数·算法·机器学习
ゞ 正在缓冲99%…16 分钟前
leetcode76.最小覆盖子串
java·算法·leetcode·字符串·双指针·滑动窗口
xuanjiong17 分钟前
纯个人整理,蓝桥杯使用的算法模板day2(0-1背包问题),手打个人理解注释,超全面,且均已验证成功(附带详细手写“模拟流程图”,全网首个
算法·蓝桥杯·动态规划
Zhichao_9734 分钟前
【UE5 C++课程系列笔记】33——商业化Json读写
c++·ue5
惊鸿.Jh36 分钟前
【滑动窗口】3254. 长度为 K 的子数组的能量值 I
数据结构·算法·leetcode
明灯L37 分钟前
《函数基础与内存机制深度剖析:从 return 语句到各类经典编程题详解》
经验分享·python·算法·链表·经典例题
碳基学AI42 分钟前
哈尔滨工业大学DeepSeek公开课:探索大模型原理、技术与应用从GPT到DeepSeek|附视频与讲义免费下载方法
大数据·人工智能·python·gpt·算法·语言模型·集成学习
补三补四1 小时前
机器学习-聚类分析算法
人工智能·深度学习·算法·机器学习
独好紫罗兰1 小时前
洛谷题单3-P5718 【深基4.例2】找最小值-python-流程图重构
开发语言·python·算法
云边有个稻草人1 小时前
【C++】第八节—string类(上)——详解+代码示例
开发语言·c++·迭代器·string类·语法糖auto和范围for·string类的常用接口·operator[]