c++实现大数进制转换 (字符串模拟数字运算)

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

进制转换的实现与取余和取模相关:以十进制数173转换为二进制10101101为例
c++实现大数进制转换 (字符串模拟数字运算)
我们可以看到转换进制的具体流程就是对输入的数对2取模得到1,再对其对2整除得到下一个待处理数,直到待处理的数变成0,便将刚才得到的余数逆序输出。
那么观察一下这里的2,其实就是二进制的基数2

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

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

c++实现大数进制转换 (字符串模拟数字运算)

实现字符串的数字运算,其实和我们运算的过程一样,从字符串第一位开始取每一位除以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;


}


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

为了计算方便,这里的所有数字都用二进制表示
c++实现大数进制转换 (字符串模拟数字运算)

原文链接: https://www.cnblogs.com/yuyuan-bb/p/12652674.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍;

也有高质量的技术群,里面有嵌入式、搜广推等BAT大佬

    c++实现大数进制转换 (字符串模拟数字运算)

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/340428

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年3月2日 上午12:36
下一篇 2023年3月2日 上午12:36

相关推荐