#include <cstdio>
#include <cstring>
using namespace std;
typedef long long ll;
const int MAXN = 110;
int n, numberRadix8[MAXN], cnt;
char number[MAXN];
void change() {
//16进制转10进制
int len = strlen(number);
ll x = 0;
for(int i=0; i<len; i++) {
if(number[i] >= '0' && number[i] <= '9') {
x = x * 16 + (number[i] - '0');
} else {
x = x * 16 + (number[i] - 55);
}
}
//10进制转8进制
do{
numberRadix8[cnt++] = x % 8;
x /= 8;
} while(x != 0);
}
int main() {
scanf("%d",&n);
for(int i=0; i<n; i++) {
cnt = 0;
scanf(" %s",&number);
change();
for(int i=cnt-1; i>=0; i--) {
printf(" %d ",numberRadix8[i]);
if(i == 0) printf("\n");
}
}
return 0;
}
因为输入数据太长,所以下面是通过二进制转换:
#include <cstdio>
#include <string>
#include <iostream>
#include <cstring>
using namespace std;
int N;
int main() {
scanf("%d",&N);
for(int i=0; i<N; i++) {
string str1, str2 = "";
cin>>str1;
for(int j=0; j<str1.length(); j++) {
switch(str1[j]) {
case '0' : str2 +="0000"; break;
case '1' : str2 +="0001"; break;
case '2' : str2 +="0010"; break;
case '3' : str2 +="0011"; break;
case '4' : str2 +="0100"; break;
case '5' : str2 +="0101"; break;
case '6' : str2 +="0110"; break;
case '7' : str2 +="0111"; break;
case '8' : str2 +="1000"; break;
case '9' : str2 +="1001"; break;
case 'A' : str2 +="1010"; break;
case 'B' : str2 +="1011"; break;
case 'C' : str2 +="1100"; break;
case 'D' : str2 +="1101"; break;
case 'E' : str2 +="1110"; break;
case 'F' : str2 +="1111"; break;
default:break;
}
}
int len2 = str2.length();
if(len2 % 3 == 1) {
str2 = "00" + str2;
} else if(len2 % 3 == 2) {
str2 = "0" + str2;
}
len2 = str2.length();
for(int j=0; j<=len2 - 3; j+=3) { //
int num = 4 * (str2[j] - '0') + 2 * (str2[j+1] - '0') + (str2[j+2] - '0');
if(num == 0 && j == 0) {
continue;
}
printf("%d",num);
}
printf("\n");
}
return 0;
}