入门到入土 | 进制转化
进制转化
大家都知道,从十进制转化为其他进制的一个好方法是短除法
这个大家都知道,简单来讲呢,就是将这个十进制数不断短除要化为的进制,直到最后除到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:更新进制转化
Do you like WHAT YOU SEE ?