1.进制的本质
进制是一种表示数字的方式,它的本质在于如何使用有限数量的符号(通常称为数字或字符)来表示数字。在我们通常使用的十进制系统中,我们使用10个数字(0到9)来表示所有数字。而在二进制系统中,我们只使用两个数字(0和1)表示数字。其他常见的进制包括八进制(使用8个数字)和十六进制(使用16个数字)等。
对于一个十进制数字,比如 153,本质就是
那么对于二进制,就是将10变成2:
2. 例子:将任意进制转换为十进制
假设一个数组来表示k进制(假设K>10)的整数,我们如何得到她的十进制数?
假设这个K为12进制,我们有个3A4B转换为十进制,以上面的方法:
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 |
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | A | B |
所以数组应该是这样表示:
a[i] | 3 | A=10 | 4 | B=11 |
*12的多少次方 | ||||
下标 | 0 | 1 | 2 | 3 |
所以程序就是:
#include <bits/stdc++.h>
using namespace std;
//k为指定的进制数
int k_to_decimal(int arr[],int size,int k){
int ans=0;
for(int i=0;i<size;i++)
ans=ans*k+arr[i];
cout << ans;
}
int main(){
int k=12,arr[]={3,10,4,11},size = sizeof(arr) / sizeof(arr[0]);//12进制
k_to_decimal(arr,size,k);
}
3. 十进制转换为其他进制
如153的十进制转换为16进制:
153/16=9.5625 余:9 所以是
如153的十进制转换为12进制:
153/12=12.75 余:9
12/12=1 余:0
1/12=0.08 所以是
所以代码如下:
long long x; cin >> x;
while(x) a[++ cnt] = x%k,x/=k;
reverse(a+1,a+1+cnt);//注意要翻转一下,才能使得高位在1的位置
#include <bits/stdc++.h>
using namespace std;
int main(){
int s =153,k=16,ans=0;
for(int poww=0;s>0;poww++){
ans += (s%k)*pow(10,poww);
s/=k;
}
cout << ans ;
}
4. 蓝桥杯代码真题
#include <bits/stdc++.h>
using namespace std;
//步骤:
//1.先列出一个包含0-f最大十六进制的数组
//2.将对应的字符串转换为int类型
//3.使用模板将对应的进制转换
using ll = long long;
const int N=1000;
int a[N];
char ch[]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
void solve(){
int n,m; cin >> n >> m;
string s;cin >> s;
int len=s.length();
s="#"+s;
for(int i=1;i<=len;i++){
if('0'<=s[i] && s[i]<='9') a[i]=s[i]-'0';
else a[i]=s[i]-'A'+10;
}
//机制转换模板
ll x=0;
for(int i=1;i<=len;i++) x=x*n+a[i];
string ans;
while(x){
ans+=ch[x%m];
x/=m;
}
reverse(ans.begin(),ans.end());
cout << ans << '\n';
}
int main()
{
ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
int _;cin >> _;
while(_--) solve();
return 0;
}