zoukankan      html  css  js  c++  java
  • c++实现大数进制转换 (字符串模拟数字运算)

    注:这个主要用于10进制及以下的相互转换

    进制转换的实现与取余和取模相关:以十进制数173转换为二进制10101101为例

    我们可以看到转换进制的具体流程就是对输入的数对2取模得到1,再对其对2整除得到下一个待处理数,直到待处理的数变成0,便将刚才得到的余数逆序输出。
    那么观察一下这里的2,其实就是二进制的基数2

    看完这张图,我们的脑海里应该有了大体结构,就是我们的程序输入基数,输入待处理的数字173,然后通过一个循环结构得到余数,和下一个待处理的数,循环终止的条件应该和0相关,最后再通过拼接字符串或者其他方式输出我们的余数。

    那么我们还没有解决如何得到余数的问题,同样以173除2为例

    实现字符串的数字运算,其实和我们运算的过程一样,从字符串第一位开始取每一位除以m,那么如果遇到有余数的怎么处理呢?在这里17除2余1,可以发现下一步是13除2,因此余数参与下一次运算的方式应该是1*10+str[i],str[i]是字符串的下一位,而10其实就取决于我们原来输入数字的基数,这里是十进制。那么173%2的结果是多少呢,其实就是最后一步运算得到的余数1。

    具体实现代码如下:

    
    
    #include<iostream>
    #include<string>
    #include <algorithm>
    using namespace std;
    
    string division(string str, int m, int n, int & remain){
        string result = "";
        int a;
        remain = 0;
    
        for(int i = 0; i < str.size(); i++){
            a = (n * remain + (str[i] - '0'));
            str[i] = a / m + '0';
            remain = a % m;
        }
        //去掉多余的0 比如10/2=05
        int pos = 0;
        while(str[pos] == '0'){
            pos++;
        }
        return str.substr(pos);
    }
    
    string conversion(string str, int m, int n){
        string result = "";
        char c;
        int a;
        //因为去掉了多余的0,所以终止条件是字符串为空 例:当上一步运算结果为"0"时,实际上返回的结果为""
        while(str.size() != 0){
            str = division(str, m , n,a);
            result = char(a + '0') +result;
    
        }
        return result;
    }
    int main(){
        string a,b;
      //  cout << division("173",2, 10);
      //  cout << conversion("10101101", 10, 2);
        cin >> a;
        b = conversion(a,2,10);
    
        reverse(b.begin(), b.end());
        a = conversion(b,10,2);
        cout << a << endl;
    
    
    }
    
    
    

    其实别看十进制转二进制如此,二进制转十进制也是一样的(尽管平时为了计算方便都是加法)

    为了计算方便,这里的所有数字都用二进制表示

  • 相关阅读:
    115.子集和的目标值(大数据的01背包)
    116. 张程易,编程易(01背包)
    110.科技庄园(多重背包)(未结题)
    113.失恋28天-缝补礼物(多重背包)
    109.关路灯(区间dp)
    107.01背包变式题型:传纸条
    cojs.tk(所有题目来源) 树状数组专练
    在线评测的网站
    108.方格取数
    106.运输装备(二维01背包)
  • 原文地址:https://www.cnblogs.com/yuyuan-bb/p/12652674.html
Copyright © 2011-2022 走看看