进制转换热知识

发布时间 2024-01-01 21:29:14作者: Gary_NotFound

更多详细内容参见此博客 传送门

作者的号在这里

前言

还在为搞不懂进制转换的原理而感到苦恼吗?

还在为考试因为进制转换惨痛离场吗?

还在为不会打进制转换代码而沮丧吗?

STL库函数+进制转换极简代码

满足你的一切需求!


怎样实现进制转换(有几种方式)

  1. 自定义进制转换函数

将一个n进制的数转换为m进制的数,这个过程需要一个过渡,就是先将一个n进制的数转换为10进制,再将十进制数转换为m进制的数,任意进制转换为十进制的思路就是按权展开,十进制转任意进制就是求余数,直到商数为零,然后逆向取余。

  1. 调用C++中的STL函数直接转换(着重讲解)

实现

首先,让我隆重欢迎

printf的自带进制转换和cout自带进制转换

作为c++“特性”,STL库里带几个函数是很正常的

#include <iostream>

#include <cstdio>

#include <algorithm>

#include <bitset>

using namespace std;

int main(){

printf("%05o\n",300);    //按八进制格式输出,保留5位高位补零

printf("%03d\n",300);    //按十进制格式输出,保留3位高位补零

printf("%05x\n",300);    //按十六进制格式输出,保留5位高位补零

cout<<"300的8进制:"  <<std::oct <<300<<endl;  	//按八进制格式输出

cout<<"300的10进制:" <<std::dec <<300<<endl;  	//按十进制格式输出

cout<<"300的16进制:" <<std::hex <<300<<endl;  	//按十六进制格式输出

cout<<"300的2进制:"  <<bitset<8>(300)<<endl;    //<8>:表示保留8位输出

return 0;

}

还算有点帮助吧?如果这个还是记不住,那么下面这个maybe正合你的心意

_itoa() 函数:

头文件: #include
作用: 将一个10进制数转换为任意的2-36进制字符串
格式: itoa(num, str, m); num是一个int型的,是要转化的10进制数,str是转化结果,m为目标进制。
#include<cstdio> 

#include<cstdlib> 

int main(){  

  int num = 10;  
  
  char str[100];  
  
  _itoa(num, str, 2);  //c++中一般用_itoa,用itoa也行,
  
  printf("%s\n", str);  
  
  return 0;  

  }

函数的世界真奇妙,STL函数合心意

去刷几道题吧!

P1143 进制转换

B2143 进制转换

P2084 进制转换

B3620 x 进制转 10 进制

B3619 10 进制转 x 进制

B3869 [GESP202309 四级] 进制转换

B3849 [GESP样题 三级] 进制转换

附上# B3869 [GESP202309 四级] 进制转换官方代码

#include <iostream>
#include <cstring>
using namespace std;
int trans_digit(int k, char c) {
	if (c <= '9')
		return (c - '0');
	return (c - 'A' + 10);
}
long long trans(int k, char str[]) {
	int l = strlen(str);
	long long res = 0, pw = 1;
	for (int i = l - 1; i >= 0; i--) {
		res += pw * trans_digit(k, str[i]);
		pw *= k;
	}
	return res;
}
int main() {
	int n = 0;
	cin >> n;
	for (int t = 0; t < n; t++) {
		int k = 0;
		char str[10];
		cin >> k >> str;
		cout << trans(k, str) << endl;
	}
	return 0;
}