1.进制的本质
对于一个十进制数字,比如说153,其本质是每一个数位上的数字乘上这一位上的权重,即:
153=(1×10^2)+(5×10^1)+(3×10^0)
而二进制,只不过是把10换成了2,任意一个非负整数都有唯一的一个二进制表示:
(153)10=(10011001)2
2.将k进制的数转换为10进制的数
假设给了一个数组来表示k进制的数组
代码模版如下:
ll x=0; for(int i=0;i<=n;++i){x=x*k+a[i]; } cout<<x<<'\n';
越高的数越优先乘k,当遍历到最后一位时直接就加上a[n]就好了 而之前遍历加上的数每次都会在指数位置加1,巧妙地实现了k进制转10进制的问题
###k进制的数可以通过对输入的字符串得到
3.将10进制转换为任意进制
我们可以先假设一个x的k进制表达式,再逐步地去求解
十进制数x等于每位数乘以该位数的权重
对于这个表达式,我们可以快速计算出a0=×%k(只有a0是指数为0)
计算出a0之后,我们只需要将x/=k,就可以将原本的a1放、到a0位置上,再同样的求解即可(乘以进制为k的权重,将之放到每一位上)
代码模版如下:
ll x;cin>>x; while(x)a[++cnt]=x%k,x/k; reverse(a+1,a+1+cnt);//注意要翻转一下,才能使得高位在1的位置上
我们一般转换的是正数,所以顺着往里放就好,先放入的是高位所以在最后一定要做一次翻转,这样才是我们要得到的数
4.例题讲解
1.lanqiao OJ 2489
题目:
进制:十六进制的2021ABCD对应的十进制是多少
代码如下:(利用上述的第一个模版将字符串定义,由于是十六进制有英文字母混合在其中,所以要做出判定将之转换为对应的数字,即0到9之间减去0的ASCII码将之转换为该数的字符形式,否则减去A的ASCII码,加上一个10,接着就是套用模版了)
#include<bits/stdc++.h>
using namespace std;
const int N=50;
int a[N];
int main(){string s="2021ABCD";for(int i=0;i<s.length();++i){if(s[i]>='0'&&s[i]<='9')a[i+1]=s[i]-'0';else a[i+1]=s[i]-'A'+10;}int x=0;for(int i=1;i<=s.length();++i){x=x*16+a[i];}cout<<x<<'\n';return 0;
}
2.lanqiao OJ 2095
题目:
九进制转十进制:九进制正整数2022转换成十进制是多少
代码如下:(与上一道题的解法类似,并没有那么复杂,直接将每一位都减去0的ASCII码即可,还是利用第一套模版将之转换即可)
#include<bits/stdc++.h>
using namespace std;
const int N=50;
int a[N];
int main(){string s="2022";for(int i=0;i<s.length();++i){a[i+1]=s[i]-'0';}int x=0;for(int i=1;i<=s.length();++i){x=x*9+a[i];}cout<<x<<'\n';return 0;
}
3.lanqiao OJ 1230
题目:
进制转换:将指定的N进制数S转换为M进制(该题上难度了,灵活运用一下还是可以解决的,一个十进制转换,利用十进制数作为中转,利用第二套模版将之转换为对应的进制即可)
代码如下:
#include<bits/stdc++.h>
using namespace std;
const int N=50;
int a[N];
//向十进制转换转换
int conver10(string s,int x){for(int i=0;i<s.length();++i){if(s[i]>='0'&&s[i]<='9')a[i+1]=s[i]-'0';else a[i+1]=s[i]-'A'+10;}int h=0;for(int i=1;i<=s.length();++i){h=h*x+a[i]; }return h;
}
//向目标进制转换
string converN(int x,int y){string s;while(x>0){if(x%y>9)s+=x%y-10+'A';else s+=x%y+'0';x/=y;}reverse(s.begin(),s.end());return s;
}int main(){ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);int T;cin>>T;while(T--){int N,M;cin>>N>>M;string s;cin>>s;cout<<converN(conver10(s,N),M)<<'\n';}return 0;
}