藍橋杯練習題----十六進制轉八進制

問題描述
  給定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;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章