整数进制转换技巧以及相关算法题讲解(简洁易懂)

      本文讲解2进制到16进制之间的进制转换,并通过两道例题,来帮助大家熟练掌握不同进制之间的转换方法。

掌握各种进制数与十进制之间的互相转化即可

        网上许多教程都是举了一大堆例子,讲了各种数字进制间的转换,搞得初学者摸不着头脑。其实只要掌握各种进制数与十进制之间的互相转化即可。后面计算各个进制数间的转换过程中,拿十进制作为跳板就行了。

        1、二、八、十六进制数如何转换成十进制数:

我们以11011这个数来举例:

二进制11011和八进制11011转换成十进制(规律很简单,看图就能懂):

十六进制也是这个规律,这里就不再阐述

2、十进制数转换成二、八、十六进制数:

我们以110这个数来举例:

 十进制110转换成二、八、十六进制(规律很简单,看图就能懂):

短除法求出余数,然后逆序输出余数就是结果(开头为0要舍去)

        掌握以上两部分,也就是搞懂各进制数与十进制数之间的相互转换过程即可,其它进制间的转换只要将十进制数作为跳板就能推出来。比如八进制转换成十六进制,先把八进制转换成十进制,再将十进制转换成十六进制;二进制转换成八进制,先把二进制转换成十进制,再将十进制转换成八进制就行。

        可以尝试下以下两道算法题,可以加深对进制转换的理解(这里用C++来讲解):

Acwing801. 二进制中1的个数 (涉及十进制与二进制间的转换

给定一个长度为 n 的数列,请你求出数列中每个数的二进制表示中 1 的个数。

输入格式

第一行包含整数 n。

第二行包含 n 个整数,表示整个数列。

输出格式

共一行,包含 n 个整数,其中的第 i 个数表示数列中的第 i 个数的二进制表示中 1 的个数。

数据范围

1 ≤ n ≤ 100000
0 ≤ 数列中元素的值 ≤ 10^9

输入样例:

5
1 2 3 4 5

输出样例:

1 1 2 1 2

 AC代码:

#include<bits/stdc++.h>
using namespace std;

int main(){
	int n;
	cin >> n;
	int num;    
	int res;    
	int cnt = 0;

	while(n--){
		cin >> num;
		while(num){       //num不等于0时
			res = num % 2;    //类似短除法每一步求余数
			if(res == 1) ++cnt;    //余数是1,就让cnt+1
			num /= 2;		//因为是求二进制,所以每次都除以二
		}
		cout << cnt << " ";
		cnt = 0;
	}

	return 0;
}

洛谷P1143 进制转换  (涉及各种进制间的转换)

题目描述

请你编一程序实现两种不同进制之间的数据转换。

输入格式

共三行,第一行是一个正整数,表示需要转换的数的进制n(2≤n≤16),第二行是一个n进制数,若n>10则用大写字母A-F表示数码10−15,并且该n进制数对应的十进制的值不超过1000000000,第三行也是一个正整数,表示转换之后的数的进制m(2≤m≤16)。

输出格式

一个正整数,表示转换之后的m进制数。

输入输出样例

输入 #1

16
FF
2

输出 #1

11111111

 AC代码:

#include<bits/stdc++.h>
 using namespace std;

 int char_to_int(char a){    //字符转成数字的方法
 		return '0' <= a && a <= '9' ? a - '0' : 10 + a - 'A'; 
 	} 

 char int_to_char(int a){    //数字转成字符的方法
 		return a <= 9 ? '0' + a : a - 10 + 'A'; 
 	}

 int main(){
 	int output[35];
 	int n,m,dec = 0,num = 0;
 	string input;    //输入的数存储为字符串形式
 	cin >> n >> input >> m;

 	for(int i = 0; i < input.length(); i++){ //先转成十进制
 		dec = dec*n + char_to_int(input[i]);
 	}

 	while(dec){    
 		output[num++] = dec % m, dec /= m; //再通过十进制为跳板,转为其它进制数
 	}

 	for(int i = num - 1; i >= 0; i--){
 		cout << int_to_char(output[i]);    //输出
 	}

 	cout << endl;

 	return 0;
 }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值