C++:万能进制转换

引言

本文介绍的这个 p p p 进制与十进制之间的转换,主要是针对算法竞赛中的,对于一些特殊情况,比如说字母大小写、前导零、非法输入的处理等这些问题其实都没有去深究,因为在算法竞赛中给你的数据都是合法的,然后只需要你跟据这个来进行简单的转换即可。而对于要实现一些库函数,怎么确保它的安全性和正确性,暂时先不考虑了。


一、p进制转为十进制

思路:字符串最左边的下标是从 0 0 0 开始的,所以说 0 0 0 号下标是权重最大的了。我们依次从 0 0 0 号下标开始遍历,每一次都将现有的数乘以 p p p ,相当于左移了一位,然后再加上当前的值。动态的想:先将当前数全部向左移一位,然后再加上当前位的数。然后就是对数字和字母的处理了,详情见代码。

int p_to_ten(string s, int p)  // p进制字符串 转换为 十进制数 
{
	int res = 0;
	for(int i = 0; i < s.size(); ++i)
	{
		res *= p;
		if(s[i] >= 'A' && s[i] <= 'Z') res += s[i] - 'A' + 10;
		else res += s[i] - '0';
	}
	return res;
}

二、十进制转换为p进制

思路:类比于十进制数,第一次取模所得的数是最低位的数,然后对原本的数除以 p p p ,相当于将整个数向右移了一位,然后再取模,相当于取第二个数的模,就这样重复此过程,直到为 0 0 0 。因为第一次添加的数相当于是低位,而我们是依次向后添加数的,所以最后翻转一下,就是最终的结果了。

string ten_to_p(int nums, int p)  // 十进制数 转换为 p进制字符串 
{
	string res;
	while(nums)
	{
		int t = nums % p;
		if(t < 10) res.push_back(t + '0');
		else res.push_back(t - 10 + 'A');
		nums /= p;
	}
	reverse(res.begin(), res.end());
	return res;
}

三、测试

测试用例:

#include <iostream>
#include <algorithm>

using namespace std;

int p_to_ten(string s, int p)  // p进制字符串 转换为 十进制数 
{
	int res = 0;
	for(int i = 0; i < s.size(); ++i)
	{
		res *= p;
		if(s[i] >= 'A' && s[i] <= 'Z') res += s[i] - 'A' + 10;
		else res += s[i] - '0';
	}
	return res;
}

string ten_to_p(int nums, int p)  // 十进制数 转换为 p进制字符串 
{
	string res;
	while(nums)
	{
		int t = nums % p;
		if(t < 10) res.push_back(t + '0');
		else res.push_back(t - 10 + 'A');
		nums /= p;
	}
	reverse(res.begin(), res.end());
	return res;
}

int main() {  
    // 二进制转十进制  
    std::string binary = "1010";  
    int decimal_from_binary = p_to_ten(binary, 2);  
    std::cout << "Binary " << binary << " to decimal: " << decimal_from_binary << std::endl;  
  
	// 十进制转二进制  
    int decimal = 10;  
    std::string binary_from_decimal = ten_to_p(decimal, 2);  
    std::cout << "Decimal " << decimal << " to binary: " << binary_from_decimal << std::endl;    
  
    // 八进制转十进制  
    std::string octal = "765";  
    int decimal_from_octal = p_to_ten(octal, 8);  
    std::cout << "Octal " << octal << " to decimal: " << decimal_from_octal << std::endl;  
  
    // 十进制转八进制  
    int another_decimal = 501;  
    std::string octal_from_decimal = ten_to_p(another_decimal, 8);  
    std::cout << "Decimal " << another_decimal << " to octal: " << octal_from_decimal << std::endl;  
  
    // 十进制转十六进制  
    int hex_decimal = 2765;  
    std::string hex_uppercase = ten_to_p(hex_decimal, 16);  
    std::cout << "Decimal " << hex_decimal << " to hex: " << hex_uppercase << std::endl;  
    
    // 十六制转十进制  
    std::string hex = "ACD";  
    int decimal_from_hex = p_to_ten(hex, 16);  
    std::cout << "Hex " << hex << " to decimal: " << decimal_from_hex << std::endl;  
  
    return 0;  
}

测试结果:

Binary 1010 to decimal: 10
Decimal 10 to binary: 1010
Octal 765 to decimal: 501
Decimal 501 to octal: 765
Decimal 2765 to hex: ACD
Hex ACD to decimal: 2765

--------------------------------
Process exited after 0.114 seconds with return value 0
请按任意键继续. . .

相关推荐

  1. C++:万能转换

    2024-04-09 12:36:02       40 阅读
  2. C/C++转换

    2024-04-09 12:36:02       53 阅读
  3. HJ5 转换C语言】

    2024-04-09 12:36:02       53 阅读
  4. 转换(C++)(简易)(字符串)

    2024-04-09 12:36:02       51 阅读
  5. (二).数值&转换

    2024-04-09 12:36:02       38 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-04-09 12:36:02       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-04-09 12:36:02       101 阅读
  3. 在Django里面运行非项目文件

    2024-04-09 12:36:02       82 阅读
  4. Python语言-面向对象

    2024-04-09 12:36:02       91 阅读

热门阅读

  1. iOS MT19937随机数生成,结合AES-CBC加密算法实现。

    2024-04-09 12:36:02       27 阅读
  2. 头歌:共享单车之数据可视化

    2024-04-09 12:36:02       38 阅读
  3. 计算机网络-ICMP和ARP协议——沐雨先生

    2024-04-09 12:36:02       38 阅读
  4. Ubuntu22.04 安装 Supabase

    2024-04-09 12:36:02       34 阅读
  5. 【力扣】238. 除自身以外数组的乘积

    2024-04-09 12:36:02       40 阅读
  6. npm的一些经常使用的命令

    2024-04-09 12:36:02       36 阅读
  7. CSS变换

    CSS变换

    2024-04-09 12:36:02      31 阅读