任意进制

10进制 VS 2进制

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

简单思路

运用除法与取模实现进制转换。

PS:若涉及大于10进制的转换时,可以使用map存储数字对应的字母表示。(此处尚未考虑,思路是一样的)

(一) string divide(string num, int m, int n, char& ch)

负责将m进制的num转化成n进制过程中使用的除法操作。

  • 函数作用:返回 ((m进制的num)/n) 的结果,即。 ch传递 (m进制的num)%n 的结果,即余数
  • m --- num的进制
  • n --- num要转换成的进制
  • ch --- num%n的余数

关键点:

  1. remain记录当前余数
  2. 更新num[i]
  3. 返回值删除前置0

代码:

string divide(string num, int m, int n, char& ch) {
    // string res = "";
    int len = num.length();
    int remain = 0;
    for(int i = 0; i<len; i++) {
        int t = remain*m+num[i]-'0';
        num[i] = t/n+'0';
        remain = t%n;
    }
    int i = 0;
    while (num[i]=='0') {
        i++;
    }
    ch = char(remain+'0');
    return num.substr(i);
}

(二)string change(string num, int from, int to)

思路:

  1. 每次都用 from进制 的 num 除以 to,返回值更新 num;
  2. 直到 num为空 时,停止循环。
  3. 关于为什么为空而不是'0'? 因为divide返回的结果会删除前置0,当除以结果为'0'时删除前置0剩下空字串。

负责实现from到to的进制转换。

  • from:num的进制。
  • to:num要转换成的进制。

关键点:

  1. 每次都要更新 num 的值。
  2. 更新res:先生成低位。

代码:

string change(string s, int from, int to) {  // 转为2进制
    string res = "";
    while(s.size()!=0) {
        char bit;
        // int bit = (s.back()-'0') % to;
        // res = char(bit+'0') + res;
        s = divide(s, from, to, bit);
        res = char(bit) + res;
    }
    return res;
}

完整代码

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

string divide(string num, int m, int n, char& ch) {
    // string res = "";
    int len = num.length();
    int remain = 0;
    for(int i = 0; i<len; i++) {
        int t = remain*m+num[i]-'0';
        num[i] = t/n+'0';
        remain = t%n;
    }
    int i = 0;
    while (num[i]=='0') {
        i++;
    }
    ch = char(remain+'0');
    return num.substr(i);
}

string change(string s, int from, int to) {  // 转为2进制
    string res = "";
    while(s.size()!=0) {
        char bit;
        // int bit = (s.back()-'0') % to;
        // res = char(bit+'0') + res;
        s = divide(s, from, to, bit);
        res = char(bit) + res;
    }
    return res;
}

/*
string multiple(string num, int n) { // n进制转10进制
    string res = "";
    int carry =0;
    for(int i = num.length()-1; i>=0; i--) {
        int t = (num[i]-'0') * n + carry;
        res = char(t%10+'0') + res;
        carry = t/10;
    }
    if(carry!=0) {
        res = char(carry+'0') + res;
    }
    return res;
}

string add(string num, int n) {
    string res = "";
    int carry = 0;
    for(int i = num.length()-1; i>=0; i--) {
        int sum = num[i]-'0'+carry;
        res = char(sum%10+'0') + res;
        carry = sum/10;
    }
    if(carry!=0) res = char(carry+'0') +res;
    return res;
}
*/

int main() {
    string num;
    while (cin >> num) { // 注意 while 处理多个 case
        string s = change(num, 10, 2);
        reverse(s.begin(), s.end());
        s = change(s, 2, 10);
        cout << s << endl;
    }
}
// 64 位输出请用 printf("%lld")

全部评论

相关推荐

07-14 12:29
门头沟学院 Java
后端岗,实习三周感觉有点想跑路了,担心秋招被拉黑,有没有佬是字节HR知道情况的
从零开始的转码生活:你实习三周都想跑路,将来拿到offer真的愿意在这干十几二十年吗
投递字节跳动等公司8个岗位
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
07-16 18:05
何尝不是一种学历歧视呢
码农索隆:楼主明确拒绝,并说明拒绝原因了,这hr倒是挺忠心护主的
点赞 评论 收藏
分享
自学java狠狠赚一...:骗你点star的,港卵公司,记得把star收回去
点赞 评论 收藏
分享
06-27 12:54
已编辑
门头沟学院 Java
累了,讲讲我的大学经历吧,目前在家待业。我是一个二本院校软件工程专业。最开始选专业是觉得计算机感兴趣,所以选择了他。本人学习计算机是从大二暑假结束开始的,也就是大三开始。当时每天学习,我个人认为Java以及是我生活的一部分了,就这样持续学习了一年半,来到了大四上学期末,大概是在12月中旬,我终于找的到了一家上海中厂的实习,但我发现实习生的工作很枯燥,公司分配的活也不多,大多时间也是自己在自学。就这样我秋招末才找到实习。时间来到了3月中旬,公司说我可以转正,但是转正工资只有7000,不过很稳定,不加班,双休,因为要回学校参加答辩了,同时当时也是心高气傲,认为可以找到更好的,所以放弃了转正机会,回学校准备论文。准备论文期间就也没有投递简历。然后时间来到了5月中旬,这时春招基本也结束了,然后我开始投递简历,期间只是约到了几家下场面试。工资也只有6-7k,到现在我不知道该怎么办了。已经没有当初学习的心劲了,好累呀,但是又不知道该干什么去。在家就是打游戏,boss简历投一投。每天日重一次。26秋招都说是针对26届的人,25怎么办。我好绝望。要不要参加考公、考研、央国企这些的。有没有大佬可以帮帮我。为什么感觉别人找工作都是顺其自然的事情,我感觉自己每一步都在艰难追赶。八股文背了又忘背了又忘,我每次都花很长时间去理解他,可是现在感觉八股、项目都忘完了。真的已经没有力气再去学习了。图片是我的简历,有没有大哥可以指正一下,或者说我应该走哪条路,有点不想在找工作了。
码客明:太累了就休息一下兄弟,人生不会完蛋的
如果实习可以转正,你会不...
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务