课后自主练习(高精度)1069. 二进制倒置 super《编程思维与实践》个人学习笔记

题目

在这里插入图片描述
数据
3
10
0
10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

思路:十进制转二进制

分三步
①十进制转化二进制
由于输入的字符过多,只能用字符串接受,然后把他们放在字符串里面依次处理

a 十进制转二进制就是看末尾是否为偶数,如果是偶数就是0
奇数就是1,然后往二进制字符串的首位插入(你放末尾也可以,记得最后反转一下就好)
然后十进制的数字要每次进行判断(是否全是0 和 /2)操作

是否全是0就遍历一遍即可

/2的时候就进行判断,如果这个位是偶数直接除即可,如果不是偶数那就往后一位+10,再/2

void trans_bin(string ten, string & bin)
{
    int len = ten.length();
    int * pc = new int[len];
    for(int i = 0; i < len;i++)
    {
        pc[i] = ten[i] - '0';
    }
    
    if(ten == "0")
    {bin = "0"; return;}

    while(1)
    {
        
        int flag = 1;
        for(int i = 0; i < len; i++)
        {
            if(pc[i])
            {    
                flag = 0;
                break;
            }    
        }
        if(flag)
        {break;}

        if(pc[len - 1] % 2)
            bin.insert(0,1,'1');
        else
            bin.insert(0,1,'0');
        
        for(int i = 0; i < len - 1; i++)
        {
            if(pc[i] % 2)
            {
                pc[i + 1] += 10;
            }
            pc[i] /= 2;
        }
        pc[len - 1] /= 2;

    }
    delete[] pc;
}

思路:反转

没啥好说的,直接用reserve函数也可以,然后遍历开头的0直到出现1为止

void rev(string & a, string & b)
{
    int len = a.length();
    for(int i = 1; i <= len ;i++)
    {
        b += a[len - i];
    }
    while(b[0] == '0' && b.length() != 1)
    {b.erase(0,1);}
    return;
}

思路:二进制转十进制

懂了10转2也应该懂2转10了

有一个易错点:就是要让每一个数字×2之后在进行进位,否则可能会把进位的1也额外的×2导致数值错误

void trans_ten(string & s, string& d)
{
    int len = s.length();
    d.insert(0,1,s[0]);

    for(int i = 1; i < len; i++)
    {
        int dlen = d.length();
        int * arr = new int[dlen];
        for(int j = 0; j < dlen; j++)
        {
            arr[j] = d[j] - '0';
        }
        d = "";

        // for(int j = 0; j < dlen; j++)
        // {cout << arr[j];}
        // cout << endl;

        int carry = 0;
        for(int j = dlen - 1; j > 0 ;j--)
        {
            arr[j] *= 2;
            
            if(carry)
                arr[j] += 1;
            //应该在*2之后再加carry
            if(arr[j] >= 10)
            {
                carry = 1;
                arr[j] -= 10;
            }
            else
                carry = 0;
        }
        arr[0] *= 2;
        if(carry)
        {arr[0] += 1;}
        if(arr[0] >= 10)
        {
            arr[0] -= 10;
            carry = 1;
        }
        else
            carry = 0;

        arr[dlen - 1] += s[i] -'0';

        // for(int j = 0; j < dlen; j++)
        // {cout << arr[j];}
        // cout << "?" << endl;//


        for(int j = dlen - 1; j >= 0; j--)
            d.insert(0,1,arr[j] + '0');

        if(carry)
            d.insert(0,1,'1');

        
        
        //delete[] arr;
    }
    cout << d << endl;

}

代码

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

void trans_bin(string ten, string & bin)
{
    int len = ten.length();
    int * pc = new int[len];
    for(int i = 0; i < len;i++)
    {
        pc[i] = ten[i] - '0';
    }
    
    if(ten == "0")
    {bin = "0"; return;}

    while(1)
    {
        
        int flag = 1;
        for(int i = 0; i < len; i++)
        {
            if(pc[i])
            {    
                flag = 0;
                break;
            }    
        }
        if(flag)
        {break;}

        if(pc[len - 1] % 2)
            bin.insert(0,1,'1');
        else
            bin.insert(0,1,'0');
        
        for(int i = 0; i < len - 1; i++)
        {
            if(pc[i] % 2)
            {
                pc[i + 1] += 10;
            }
            pc[i] /= 2;
        }
        pc[len - 1] /= 2;

    }
    delete[] pc;
}

void rev(string & a, string & b)
{
    int len = a.length();
    for(int i = 1; i <= len ;i++)
    {
        b += a[len - i];
    }
    while(b[0] == '0' && b.length() != 1)
    {b.erase(0,1);}
    return;
}


void trans_ten(string & s, string& d)
{
    int len = s.length();
    d.insert(0,1,s[0]);

    for(int i = 1; i < len; i++)
    {
        int dlen = d.length();
        int * arr = new int[dlen];
        for(int j = 0; j < dlen; j++)
        {
            arr[j] = d[j] - '0';
        }
        d = "";

        // for(int j = 0; j < dlen; j++)
        // {cout << arr[j];}
        // cout << endl;

        int carry = 0;
        for(int j = dlen - 1; j > 0 ;j--)
        {
            arr[j] *= 2;
            
            if(carry)
                arr[j] += 1;
            //应该在*2之后再加carry
            if(arr[j] >= 10)
            {
                carry = 1;
                arr[j] -= 10;
            }
            else
                carry = 0;
        }
        arr[0] *= 2;
        if(carry)
        {arr[0] += 1;}
        if(arr[0] >= 10)
        {
            arr[0] -= 10;
            carry = 1;
        }
        else
            carry = 0;

        arr[dlen - 1] += s[i] -'0';

        // for(int j = 0; j < dlen; j++)
        // {cout << arr[j];}
        // cout << "?" << endl;//


        for(int j = dlen - 1; j >= 0; j--)
            d.insert(0,1,arr[j] + '0');

        if(carry)
            d.insert(0,1,'1');

        
        
        //delete[] arr;
    }
    cout << d << endl;

}


int main()
{
    int t;
    cin >> t;
    for(int i = 0; i < t; i++)
    {

        cout << "case #" << i << ":"<<endl;
        string bin;
        string re_bin;
        string ten;
        string re_ten;
        cin >> ten;

        trans_bin(ten,bin);//
        rev(bin,re_bin);
        //cout << "bin " << bin << endl << "re_bin " << re_bin << endl; 
        trans_ten(re_bin,re_ten);


    }//

    return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值