算法笔记之旅 | 进制转换

进制转换

进制转换是一个很常用的技巧,平时在刷题中一般是一个小模块,在一个大题里面作为数据处理的步骤。

数据定义:待转换数Q为W进制,需要转换为P进制。

下面是进制转换的一般流程:
(1)将Q先转换为10进制数temp
(2)将temp再转换为P进制

以下为算法的详细步骤:

(1)

首先要先明确一个定义,即十进制的数 y = d 1 d 2 d 2 d 3 . . . d n y=d_{1}d_{2}d_{2}d_{3}...d_{n} ,如53245,5万2千3百4十5。令其为 y y ,那么其中 d 1 = 5 d_{1}=5 d 2 = 3... d 3 = 2 d_{2}=3...d_{3}=2 等等,它可以写成以下形式:

y = d 1 1 0 n 1 + d 2 1 0 n 2 + d 3 1 0 n 3 . . . + d n y=d_{1}*10^{n-1}+d_{2}*10^{n-2}+d_{3}*10^{n-3}...+d_{n}

由此,一个 W W 进制数 Q = a 1 a 2 a 2 a 3 . . . a n Q=a_{1}a_{2}a_{2}a_{3}...a_{n} 也可以写成:

Q = a 1 W n 1 + a 2 W n 2 + a 3 W n 3 . . . + a n Q=a_{1}*W^{n-1}+a_{2}*W^{n-2}+a_{3}*W^{n-3}...+a_{n}

而这个公式实际上就直接计算出了其10进制的值,对公式从右往左累加其值即可。由以上,将 Q Q 转换为10进制可以由如下循环得到:

	int x=1101;             //设定上为2进制,值应该为13,将其转换为10进制的y 
	int y=0,pro=1;          //pro为辅助值,用来计算2的阶乘如2^0=1,2^1=2,2^2=4,其值将分别为1,2,4
	while(x!=0)
	{
		y=y+(x%10)*pro;     //只要不断累加y,就可以计算出x的10进制值,原理就是借助上面的公式 
		x=x/10;
		pro=pro*2; 
	} 

(2)

将10进制数temp转化为P进制,可以用除基取余法。比如将15转化为2进制:

15除2,等于7,余1;
7出2,等于3,余1;
3除2,等于1,余1;
1除2,等于0,余1;算法终止。
这样将位数从后往前拼凑,答案即为1111。

扫描二维码关注公众号,回复: 11317291 查看本文章

实现如下:

	int x=11,num=0;        //x为10进制数,将要转化的2进制数的每一位放在ans里,num记录2进制数的位数 
	int ans[1024]={0};
	do
	{
		ans[num++]=x%2;
		x/=2;		
	}while(x!=0)

总结:进制转换作为一个小技巧,经常出现在大题的数据处理部分,其算法简单有效。本文介绍的两步,都是 O ( n ) O(n) 级的算法。其中初学者对(1)部分的算法容易忘记,可以尝试多编写,记忆。

猜你喜欢

转载自blog.csdn.net/qq_40291234/article/details/106839542
今日推荐