题解 | #10进制 VS 2进制#

10进制 VS 2进制

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

思路

熟记高精度加减乘除 变量一定要初始化

AC代码

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

vector<int> div(vector<int>& a,int b){
    int t=0;
    vector<int> ans;
    for(int i=a.size()-1;i>=0;i--){
        t=t*10+a[i];
        ans.push_back(t/b);
        t%=b;
    }
    reverse(ans.begin(),ans.end());//想一想结果的高位在哪里
    while(ans.size() && ans.back()==0)  ans.pop_back();
    return ans;
}

vector<int> mul(vector<int> &A,int b){
    int t=0;//一定要初始化!!!!
    vector<int> ans;
    for(int i=0;i<A.size();i++){
        t+=b*A[i];
        ans.push_back(t%10);
        t=t/10;
    }
    if(t) ans.push_back(t);//注意要判断一下
    while(ans.size()>1 && ans.back()==0)  ans.pop_back();
    return ans;
}


vector<int> add(vector<int> &a,vector<int> &b){
    if(a.size()<b.size()) return add(b,a);
    int t=0;
    vector<int> ans;
    for(int i=0;i<a.size();i++){
        t+=a[i];
        if(i<b.size()) t+=b[i];
        ans.push_back(t%10);
        t=t/10;
    }
    if(t) ans.push_back(t);
    return ans;
}


int main(){
    string s;
    cin >> s;
    vector<int> a,to2;
    for(int i=s.size()-1;i>=0;i--){
        a.push_back(s[i]-'0');
    }
    while(a.size()){
        to2.push_back(a[0]%2);
        a=div(a,2);
    }
    reverse(to2.begin(),to2.end());
    vector<int> t;
    vector<int> res;
    t.push_back(1);
    for(int i=0;i<to2.size();i++){
        if(to2[i]) res = add(res,t);
        t = mul(t,2);
    }
    for(int i=res.size()-1;i>=0;i--){
        cout << res[i];
    }
    return 0;
    
}
全部评论

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务