题解 | 进制转换

#include <bits/stdc++.h>
using namespace std;

//double 在cpp中是无法使用%的,所以必须要实现大数除法
string Divide(string s,int x){
    int remainder = 0;
    for(int i=0;i<s.size();i++){
        int current = remainder * 10 + s[i] - '0';//模拟手动除法,当前除算内容
        s[i] = current / x +'0';//取到上面的值,直接存在这个位置刚刚好
        remainder = current % x;//求下次的余数
    }//计算机就是人类逻辑的底层拆解
    int pos=0;
    while(s[pos]=='0') pos++;//注意到,除不到的时候我们计算中是空过去的,实际上是写入了0,所以用此截断
    return s.substr(pos);
}

int main(){
    //根据特性,可以发现,取余数是这样的
    string s;
    while(cin>>s){
        string a;
        while(s.size()!=0){
            int last = s[s.size()-1]-'0';
            a.push_back(last%2+'0');
            s = Divide(s,2);
        }
        reverse(a.begin(),a.end());
        cout<<a<<endl;
    }
}

核心思路是30位,所以只需要实现大数除法即可。大数除法是也可以得到余数的,但是我们不需要这样做,我们最后的结果就是除二,余数其实就是尾一位求模即可,所以直接算余数,然后算一个大数除法算出来除法结果,对于大数除法,有一点需要注意,就是我们对大数除法的结果进行了截断,因为根据除法原理,会得到如121/2=060,所以前面的0是无意义的,需要截断

全部评论

相关推荐

牛客小菜鸡66:boss里面,招人的叫老板,找工作的叫牛人
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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