题解 | #10进制 VS 2进制#思路清晰,过程复杂

10进制 VS 2进制

https://www.nowcoder.com/practice/fd972d5d5cf04dd4bb4e5f027d4fc11e

#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
#include <stack>
#include <map>
#include <queue>
#include <cmath>
using namespace std;

queue<int> que;

/**
    大数除法
    str 一个十进制的大数
    x 除数
    return 余数
*/
int divide(string& str, int x) {
    int size = str.size();
    int remainder = 0; //上一轮的余数
    for (int i = 0; i < size; i++) {
        int cur = str[i] - '0' + remainder * 10; //当前位置的值
        if (cur / x == 0) { //这一位不够除, 结果上0
            str[i] = '0';
            remainder = cur;
        } else { //这一位够除
            int t = cur / x;
            str[i] = '0' + t;
            remainder = cur % x;
        }
    }
    //有可能前面有很多0,要去掉
    int index;
    for (index = 0; index < size; index++) {
        if (str[index] != '0') {
            break;
        }
    }
    str = str.substr(index);
    return remainder;
}

/**
    str 十进制的字符串
    return 对应翻转的二进制字符串
*/
string decToBin(string str) {
    while (true) {
        if (str == "") {
            break;
        }
        int t = divide(str, 2);
        que.push(t);
    }
    string bin = "";
    while (!que.empty()) {
        int t = que.front();
        que.pop();
        bin += t + '0';
    }
    //翻转以后前面可能有0,要去掉
    int index;
    for (index = 0; index < bin.size(); index++) {
        if (bin[index] != '0') {
            break;
        }
    }
    bin = bin.substr(index);
    return bin;
}

/**
    字符串乘法
    str 乘数1
    x 乘数2
    return 返回相乘的结果
*/
void mul(string& str, int x) {
    //在这里x就是为2
    //从末尾开始乘
    int carry = 0; //进位
    for (int i = str.size() - 1; i >= 0; i--) {
        int cur = str[i] - '0'; //当前位的值
        cur = cur * x + carry;
        if (cur < 10) {
            str[i] = cur + '0';
            carry = 0;
        } else { //有进位
            carry = 1;
            str[i] = cur - 10 + '0';
        }
    }
    if (carry == 1) {
        str.insert(0, 1, '1');
    }
}

/**
    字符串加法
    str 加数1
    X 加数2 其实就是1 或者 0
*/
void plus1(string& str, int x) {
    if (x == 0) {
        return;
    } else {
        int carry = 0;
        for (int i = str.size() - 1; i >= 0; i--) {
            int cur = str[i] - '0'; //当前位的值
            cur = cur + x + carry;
            if (cur < 10) {
                str[i] = cur + '0';
                carry = 0;
                break;
            } else { //有进位
                carry = 1;
                str[i] = cur - 10 + '0';
            }
        }
        if (carry == 1) {
            str.insert(0, 1, '1');
        }
    }
}

/**
    二进制换成十进制
    bin 二进制字符串
    return 对应的十进制
*/
string binToDec(string bin) {
    string ret = "0";
    for (int i = 0; i < bin.size(); i++) {
        mul(ret, 2); //先乘2
        int x = bin[i] - '0';
        plus1(ret, x); //再相加
    }
    return ret;
}

int main() {
    string dec; //十进制
    while (getline(cin, dec)) {

        //此时bin为dec的翻转二进制
        string bin = decToBin(dec);
        
        string ret = binToDec(bin);
        
        printf("%s\n", ret.c_str());
    }
}

全部评论

相关推荐

不愿透露姓名的神秘牛友
10-05 10:13
已编辑
HHHHaos:让这些老登来现在秋招一下,简历都过不去
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务