1.常规十六进制转八进制
#include<iostream>
using namespace std;
int main()
{
int n, m;
cin >> hex >> n; //十六进制输入
cout << dec << n << endl; //十进制输出
cout << oct << n << endl; //八进制输出
return 0;
}
2.蓝桥杯练习系统遇到的,输入是超长16进制数,已AC
思路是先转为2进制再转为8进制
#include<iostream>
#include<vector>
using namespace std;
vector<int> vec2;
void Two(char c)
{
int x = (int)c - 48;
int i = 0;
int y[4] = {0, 0, 0, 0};
if(x > 10){
if(c == 'A') x = 10;
if(c == 'B') x = 11;
if(c == 'C') x = 12;
if(c == 'D') x = 13;
if(c == 'E') x = 14;
if(c == 'F') x = 15;
//这里也可以直接写成x = x - 55;
}
while(x){
y[i] = x % 2;
x /= 2;
i++;
}
for(int j = 3; j >= 0; j--){
vec2.push_back(y[j]); //倒序放入vec2中才是正确的二进制
}
}
void ba() //每三位二进制可以转为一个八进制数
{
int len = vec2.size();
int i = 0;
while(vec2[i] == 0){
i++;
}
int k = (len - i) % 3;
if(k == 0) k = 3;
i = i - (3 - k);
int oct = 0;
for(; i < len - 2; i += 3){
oct = vec2[i] * 4 + vec2[i + 1] * 2 + vec2[i + 2];
printf("%d", oct);
}
printf("\n");
}
int main()
{
long long n;
cin >> n;
string s;
for(int i = 0; i < n; i++){
cin >> s;
int len = s.size();
for(int k = 0; k < 3; k++){
vec2.push_back(0);
}
for(int j = 0; j < len; j++){
//char c = s[j];
Two(s[j]); //从最高位开始每一位16进制转为4位二进制
}
ba();
vec2.clear();
}
return 0;
}