問題描述
給定n個十六進制正整數,輸出它們對應的八進制數。
輸入格式
輸入的第一行爲一個正整數n (1<=n<=10)。
接下來n行,每行一個由0~9、大寫字母A~F組成的字符串,表示要轉換的十六進制正整數,每個十六進制數長度不超過100000。
輸出格式
輸出n行,每行爲輸入對應的八進制正整數。
【注意】
輸入的十六進制數不會有前導0,比如012A。
輸出的八進制數也不能有前導0。
樣例輸入
2
39
123ABC
樣例輸出
71
4435274
【提示】
先將十六進制數轉換成某進制數,再由某進制數轉換成八進制。
正如提示所說,我們先將十六進制轉換成二進制,然後再將二進制轉換成八進制。具體的進制轉換規則可以看這篇博客:
https://mp.csdn.net/postedit/86816757
具體的解釋見代碼註釋。
AC代碼:
#include<cstdio>
#include<iostream>
#include<cstring>
#include<cmath>
using namespace std;
char a[100005],b[400005],c[400005];
int main()
{
int n;
scanf("%d",&n);
while(n--){
scanf("%s",a);
int l=strlen(a);
int t,len=0;
for(int i=l-1;i>=0;i--){ //十六進制轉二進制
if(a[i]<='F'&&a[i]>='A')
t=a[i]-'A'+10;
else
t=a[i]-'0';
for(int j=0;j<4;j++){ //這裏是將一位十六進制數t用除2取餘法得到4位二進制數
b[len++]=t%2+'0'; //for循環控制能夠得到4位,t得到的不一定是4位,不足時就要補0
t/=2;
}
}
b[len]='\0'; //方便輸出得到的二進制數
int len1=0;
for(int i=0;i<len;){ //二進制數轉八進制
int m=0;
for(int k=0;k<3;k++){ 每3位二進制數以按權相加的方法得到一位八進制數
if(i<len)
m+=(b[i]-'0')*pow(2.0,k);
else
m+=0;
if(i<len) //當剩餘的二進制數不足3位時,就要在最左邊補0
i++;
}
c[len1]=m+'0';
len1++;
}
int j=len1-1;
while(j>=0&&c[j]=='0'){ //去除前導0,即得到的八進制數最左邊多餘的0
j--;
}
for(int i=j;i>=0;i--)
printf("%c",c[i]); //輸出得到的八進制數
printf("\n");
}
return 0;
}