十进制转任意进制(以及任意进制来回转换<了解>)

 十进制转任意进制:

#include <iostream> 
#include <vector>   
#include <string>   

using namespace std; 

// 将十进制数转换为P进制形式的字符串
string toBase(int num, int base) {
    string result = ""; // 初始化结果字符串为空
    while (num > 0) { // 当num大于0时执行循环
        int digit = num % base; // 计算num除以base的余数
        
        char digitChar; // 定义字符变量用于表示余数对应的字符
        
        if (digit >= 10) { // 如果余数大于等于10
            digitChar = 'A' + digit - 10; // 将余数转换为对应的字母(大写)
        } 
		else { // 否则余数为个位数
            digitChar = '0' + digit; // 将余数转换为对应的字符
        }
        
        result = digitChar + result; // 将当前字符添加到结果字符串的开头
        num /= base; // 更新num为num除以base的商
    }
    return result; // 返回转换后的P进制字符串
}

int main() {
	cout << "请输入需要转换的数字x和进制数P:"; 
	int x;
	cin >> x;
    int P; 
    cin >> P; 
	cout <<  toBase(x,P);

    return 0; 
}

 几个案例解释:

案例一:

  1. 用户输入: 用户输入两个值:xP。在这个例子中,x 为66,P 为4。

  2. 调用 toBase 函数: 函数 toBase 接受两个参数:要转换的十进制数 num(这里是66)和目标进制数 base(这里是4)。

  3. 循环计算

    • 第一次循环
      • 计算 66 % 4 = 2,余数为2。对应的字符是 '2'
      • 66 / 4 = 16,商为16。更新 num 为16。
    • 第二次循环
      • 计算 16 % 4 = 0,余数为0。对应的字符是 '0'.
      • 16 / 4 = 4,商为4。更新 num 为4。
    • 第三次循环
      • 计算 4 % 4 = 0,余数为0。对应的字符是 '0'
      • 4 / 4 = 1,商为1。更新 num 为1。
    • 第四次循环
      • 计算 1 % 4 = 1,余数为1。对应的字符是 '1'
      • 1 / 4 = 0,商为0,循环结束。

    由于 result 是逆序构建的,结果字符串为 '1002'

  4. 输出结果: 将 toBase 的结果输出至标准输出流。 最终结果为 '1002',即66转为4进制的表示是 '1002'

案例二: 

  1. 用户输入: 用户输入两个值:xP。在这个例子中,x 为666,P 为24。

  2. 调用 toBase 函数: 函数 toBase 接受两个参数:要转换的十进制数 num(这里是666)和目标进制数 base(这里是24)。

  3. 循环计算

    • 第一次循环
      • 计算 666 % 24 = 18,余数为18。对应的字符是 'I'
      • 666 / 24 = 27,商为27。更新 num 为27。
    • 第二次循环
      • 计算 27 % 24 = 3,余数为3。对应的字符是 '3'
      • 27 / 24 = 1,商为1。更新 num 为1。
    • 第三次循环
      • 计算 1 % 24 = 1,余数为1。对应的字符是 '1'
      • 1 / 24 = 0,商为0,循环结束。

    由于 result 是逆序构建的,结果字符串为 '1318'

  4. 输出结果: 将 toBase 的结果输出至标准输出流。 最终结果为 '1318',即666转为24进制的表示是 '1318'

案例三: 

  1. 用户输入: 用户输入两个值:xP。在这个例子中,x 为999,P 为36。

  2. 调用 toBase 函数: 函数 toBase 接受两个参数:要转换的十进制数 num(这里是999)和目标进制数 base(这里是36)。

  3. 循环计算

    • 第一次循环
      • 计算 999 % 36 = 27,余数为27。对应的字符是 'R'
      • 999 / 36 = 27,商为27。更新 num 为27。
    • 第二次循环
      • 计算 27 % 36 = 27,余数为27。对应的字符是 'R'
      • 27 / 36 = 0,商为0,循环结束。

    由于 result 是逆序构建的,结果字符串为 'RR'

  4. 输出结果: 将 toBase 的结果输出至标准输出流。 最终结果为 'RR',即999转为36进制的表示是 'RR'

任意进制之间的转换: 

#include <iostream>   
#include <vector>     
#include <string>     
  
using namespace std;   
  
// 将十进制数转换为P进制形式的字符串  
string toBase(int num, int base) {
    string result = ""; // 初始化结果字符串为空
    while (num > 0) { // 当num大于0时执行循环
        int digit = num % base; // 计算num除以base的余数
        
        char digitChar; // 定义字符变量用于表示余数对应的字符
        
        if (digit >= 10) { // 如果余数大于等于10
            digitChar = 'A' + digit - 10; // 将余数转换为对应的字母(大写)
        } 
		else { // 否则余数为个位数
            digitChar = '0' + digit; // 将余数转换为对应的字符
        }
        
        result = digitChar + result; // 将当前字符添加到结果字符串的开头
        num /= base; // 更新num为num除以base的商
    }
    return result; // 返回转换后的P进制字符串
}
  
// 将P进制数(以字符串形式给出)转换为十进制数  
int fromBase(const string& num, int base) {  
    int result = 0;  
    int power = 1;  
    for (int i = num.size() - 1; i >= 0; --i) {  
        char digitChar = num[i];  
        int digit = 0;  
        if (digitChar >= '0' && digitChar <= '9') {  
            digit = digitChar - '0';  
        } else if (digitChar >= 'A' && digitChar <= 'Z') {  
            digit = digitChar - 'A' + 10;  
        } else if (digitChar >= 'a' && digitChar <= 'z') {  
            digit = digitChar - 'a' + 10;  
        } else {  
            cerr << "Invalid character in input string!" << endl;  
            return -1; // 返回-1表示输入字符串中有无效字符  
        }  
        result += digit * power;  
        power *= base;  
    }  
    return result;  
}  
  
int main() {  //仅仅在调用第二个函数 
    cout << "请输入需要转换的数字x(以字符串形式给出)和进制数P:";   
    string x;  
    cin >> x;  
    int P;   
    cin >> P;   
  
    // 检查进制数是否合法(应在2到36之间)  
    if (P < 2 || P > 36) {  
        cerr << "Invalid base! Base should be between 2 and 36." << endl;  
        return 1;  
    }  
  
    int decimalValue = fromBase(x, P);  
    if (decimalValue != -1) {  
        cout << "转换后的十进制数为: " << decimalValue << endl;  
    }  
  
    return 0;   
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值