入门到入土 | 进制转化

进制转化

大家都知道,从十进制转化为其他进制的一个好方法是短除法

这个大家都知道,简单来讲呢,就是将这个十进制数不断短除要化为的进制,直到最后除到0.然后将余数从下往上,就是我们要求的转化后的数.

都是如果把这个用程序来实现,要计算许多次,尤其是原数很大而要转化的进制数很小这种情况

那么这里就用一种新的贪心法来转化

算法简述

假设我们要求从n进制转化为m进制

这里为了好举例子,我们取n=10,m=2

这个算法的核心就是找到第一个大于等于原数的2的次方数2^k ,让原数减去2^(k-1) ,在让其结果减去2^(k-2) ......

能减则减,直到2的0次方也就是1.

在前面的减法之中,能减的为1,不能的为0,再按照次数的大小从大到小输出,就是我们要求的2进制数

举个例子:求11在二进制下的表示?

我们可以先找到大于等于11的2^k 是 2^4 =16

那么我们按照上面的顺序来减:

11-2^3 =11-8=3 ->1

3-4<0 ->0

3-2=1 ->1

1-1=0 ->1

故11在二进制下表示为1011

实际上这个想法搞明白了之后,代码实现也很简单

代码实现

#include<iostream>
#include<stdio.h>
#define HRiver2 return
#define Warma 0//很 靠 谱 的大姐姐保佑我
using namespace std;
int main()
{
	long long  n,x=1,f[100015],m=0;
	cin>>n;
	while(x<=n)
	{
		x*=2; 
	}
	x/=2;
	while(x)
	{
		long long a=n-x;
		m++;
		if(n>=x)
		{
			f[m]=1;
			n=a;
		}
		else
		{
			f[m]=0;
		}
		x/=2;
		//for(long long  i=1;i<=m;i++)
		//cout<<f[i];	
		//cout<<endl;
		//cout<<endl;
	}
	for(long long  i=1;i<=m;i++)
		cout<<f[i];
	HRiver2 Warma;
}

怎么样,是不是特别简单?

连我都觉得简单,更不用说大佬们了,

这真是入门中的入门(

2020.3.3 UPD:更新进制转化

posted @ 2021-03-03 21:31  HerikoDeltana  阅读(139)  评论(0编辑  收藏  举报