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

10进制 VS 2进制

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

犯了一个错误,就是加法和乘法最后都需要看有无进位,如果有,则需在前添1。
因为没有考虑到加法也需要,我找了好几十分钟,希望以后吸取教训,不再犯同样的错误,大家也注意一下!!!

#include <iostream>
#include <cmath>
using namespace std;

//string类除以2
void string_chu_2(string &s)
{
    string t;
    int a=0;//余后值
    for(int i=0; i<s.size(); i++)
    {
        //除
        char c;
        c=(a*10+s[i]-'0')/2+'0';
        t=t+c;
        //余
        a=(a*10+s[i]-'0')%2;
    }
    int i=0;
    if(t!="0")
        while(t[i]=='0')
            i++;
    t.erase(0,i);
    s=t;
}

//string加法
void string_add(string &a,string s)
{
    //对齐
    int m=a.size()-s.size();
    if(m>0)
    {
        for(int i=0; i<m; i++)
            s='0'+s;
    }
    else if(m<0)
    {
        for(int i=0; i<-m; i++)
            a='0'+a;
    }

    //相加
    bool jin=false;
    string q;//相加之后的结果
    for(int i=a.size()-1; i>=0; i--)
    {
        char c;
        if(jin)
        {
            c=(a[i]+s[i]-'0'-'0'+1)%10+'0';
            jin=a[i]+s[i]-'0'-'0'+1>=10?true:false;
        }
        else
        {
            c=(a[i]+s[i]-'0'-'0')%10+'0';
            jin=a[i]+s[i]-'0'-'0'>=10?true:false;
        }
        q=c+q;
    }
    if(jin)
        q='1'+q;
    a=q;
}

//string乘2
string string_mul_2(string s)
{
    string q;
    bool jin=false;
    for(int i=s.size()-1; i>=0; i--)
    {
        char c=((s[i]-'0')*2)%10+jin+'0';
        q=c+q;
        if(s[i]>='5')
            jin=true;
        else
            jin=false;
    }
    if(jin)
        q='1'+q;
    return q;
}


int main()
{
    string a1;//输入的十进制数
    while(cin>>a1)
    {
        if(a1=="0")
        {
            cout<<0<<endl;
            continue;
        }
        string s1;//输入数的二进制表示

        //转为二进制
        while(a1!="0")
        {
            char c;
            if((a1[a1.size()-1]-'0')%2==0)
                c='0';
            else
                c='1';
            s1=c+s1;
            string_chu_2(a1);
        }
        //cout<<"s1:"<<s1<<endl;

        //将二进制数逆序过来
        string s2;//s1的逆序
        int k=s1.size()-1;
        while(s1[k]=='0')
            k--;
        for(; k>=0; k--)
            s2=s2+s1[k];
        //cout<<endl<<"s2:"<<s2<<endl;

        //二进制转十进制
        //int j=0;
        string a2="0";
        string q="1";
        for(int i=s2.size()-1; i>=0; i--)
        {
            //cout<<q;
            //cout<<"     q:"<<q<<endl;
            if(s2[i]=='1')
                string_add(a2,q);
            //cout<<"a2:"<<a2<<endl;
            q=string_mul_2(q);
        }
        //cout<<a2<<endl;
        cout<<a2<<endl;
    }
    return 0;
}

全部评论

相关推荐

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