C语言 · 十六进制转八进制
生活随笔
收集整理的這篇文章主要介紹了
C语言 · 十六进制转八进制
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
基礎練習 十六進制轉八進制
時間限制:1.0s 內存限制:512.0MB
錦囊1:
使用二進制。
問題描述
給定n個十六進制正整數,輸出它們對應的八進制數。
輸入格式
輸入的第一行為一個正整數n (1<=n<=10)。
接下來n行,每行一個由0~9、大寫字母A~F組成的字符串,表示要轉換的十六進制正整數,每個十六進制數長度不超過100000。
輸出格式
輸出n行,每行為輸入對應的八進制正整數。
【注意】
輸入的十六進制數不會有前導0,比如012A。
輸出的八進制數也不能有前導0。
樣例輸入
2
39
123ABC
樣例輸出
71
4435274
【提示】
先將十六進制數轉換成某進制數,再由某進制數轉換成八進制。
作者注釋:正如錦囊和題目提示所說:先將十六進制化成二進制,在每三位一組轉成八進制,不夠位0補之就行了——用數學方法計算也是這樣嘛,用二進制做“中間人”!
1 #include<stdio.h>
2 #include<string.h>
3
4 char h[100002],b[400002],e[400002];
5 int main(){
6 int n;
7 scanf("%d",&n);
8 while(n--){
9 scanf("%s",h);
10 int i,len=0;
11 /*先把16進制化成二進制——從后往前展開 */
12 for(i=strlen(h)-1;i>=0;i--){
13 int v;
14 if(h[i]>='0' && h[i]<='9')
15 v=h[i]-'0';
16 else v=h[i]-'A'+10;
17 for(int j=0;j<4;j++){
18 b[len++]=v%2+'0';
19 v/=2;
20 }
21 }
22 b[len]='';
23 int x=0,cnt=1;
24 int l=0;
25 for(i=0;i<len;i++){
26 /*每三位二進制轉成一位8進制,最后不足三位補0*/
27 if(cnt==4||i==len-1){
28 x=cnt*(b[i]-'0')+x;
29 cnt=1;
30 e[l++]=x+'0';
31 x=0;
32 } else{
33 x=cnt*(b[i]-'0')+x;
34 cnt*=2;
35 }
36 }
37 i=l-1;
38 while(i>=0 && e[i]=='0')
39 /*去掉前導0*/
40 i--;
41 if(i<0)
42 printf("0");
43 for (;i>=0;i--){
44 printf("%c",e[i]);
45 }
46 printf("
");
47 }
48 return 0;
49 }
總結
以上是生活随笔為你收集整理的C语言 · 十六进制转八进制的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 疯狂导弹 Crazy Missile?
- 下一篇: 修改oracle默认端口_oracle