1.将任意进制转化为 十进制
ll x = 0;
for(int i = 1;i <= n;i++){x = x * k + a[i];
}
cout << x << '\n';
例:
问题描述
请问十六进制数 2021ABCD 对应的十进制是多少?
答案提交
这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。
#include <iostream>
using namespace std;typedef long long LL;
const int N = 50;
int a[N];int main()
{string s = "2021ABCD";for(int i = 0;i < s.length();i++){if('0' <= s[i] && s[i] <= '9')a[i+1] = s[i] - '0';else a[i+1] = s[i] - 'A' + 10; }LL x = 0;for(int i = 1;i <= s.length();++i){x = x *16 + a[i];}cout << x << '\n';return 0;
}
例:
九进制正整数 (2022)9(2022)9 转换成十进制等于多少?
#include <iostream>
using namespace std;
const int N = 10;
typedef long long LL;
int a[N];int main()
{string s = "2022";for(int i = 0;i < 4;i++){a[i+1] = s[i] - '0';}LL x= 0;for(int i = 1;i <=s.length();++i){x = x*9+a[i];}cout << x<<endl;return 0;
}
2.将 十进制 转化为 任意k进制
ll x;
cin >> x;
while(x){a[++cnt] = x % k, x /= k;
}
reverse(a+1,a+1+cnt);
例:
进制转换
题目描述
给定一个 N进制数 S,请你将它转换为 M 进制。
输入描述
第一行为一个整数 T,表示测试数据数量。 (1≤T≤105)
每个测试用例包含两行,第一行包含两个整数 N,M。
第二行输入一个字符串 S,表示 N 进制数。
数据范围保证:2≤N,M≤16,若 N≥10,则用A∼F 表示字码10∼15。保证 S 对应的十进制数的位数不超过 10。
输出描述
输出共 T,每行表示一组数据的答案。
输入样例
2
2 10
10101
11 2
1793A5068
输出样例
21
10101111001010100111010101011
代码
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;int a[1000];
char ch[]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
void aa()
{ int n,m;string s;cin>>n>>m>>s;for(int i=0;i<s.size();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=0;i<s.size();i++){x=x*n+a[i];} string ss;while(x) ss+=ch[x%m],x/=m;reverse(ss.begin(),ss.end());
cout<<ss<<endl;
}
int main()
{ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);int t;cin>>t;while(t--){aa();}return 0;
}