藍橋杯: 基礎練習 十六進制轉八進制
問題
問題描述
給定n個十六進制正整數,輸出它們對應的八進制數,
輸入格式
輸入的第一行為一個正整數n (1<=n<=10),
接下來n行,每行一個由09、大寫字母AF組成的字串,表示要轉換的十六進制正整數,每個十六進制數長度不超過100000,
輸出格式
輸出n行,每行為輸入對應的八進制正整數,
【注意】
輸入的十六進制數不會有前導0,比如012A,
輸出的八進制數也不能有前導0,
樣例輸入
2
39
123ABC
樣例輸出
71
4435274
【提示】
先將十六進制數轉換成某進制數,再由某進制數轉換成八進制,
分析
100000長度的十六進制數,字串很長,用陣列切段做,
3位十六進制 = 12位二進制 = 4位八進制,
偷懶使用C++ string的字符截取函式substr(),截取3位十六進制數后,再偷懶使用sscanf轉成十進制,最后偷懶使用printf直接輸出八進制,輸出注意開頭前導零,
從前面截取開始的話,開頭可能不足3位十六進制,用長度取模3,得到開頭需要取得的長度,之后就都取3位,
代碼
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
int main(){
int n=0;
scanf("%d",&n);
int num,pos,len;
char c[4];
string str;
for (int j = 0; j < n; ++j){
cin >> str;
len = str.length();
pos = len % 3;
if(pos){
strcpy(c,str.substr(0,pos).c_str());
sscanf(c,"%X",&num);
printf("%o", num);
}
for (int i = pos; i <= len-3; i+=3){
strcpy(c,str.substr(i,3).c_str());
sscanf(c,"%X",&num);
printf("%04o", num);
}
printf("\n");
}
return 0;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/198463.html
標籤:其他
