試題 基礎練習 十六進制轉八進制

資源限制

時間限制:1.0s   內存限制:512.0MB

問題描述
  給定n個十六進制正整數,輸出它們對應的八進制數。

輸入格式
  輸入的第一行爲一個正整數n (1<=n<=10)。
  接下來n行,每行一個由0~9、大寫字母A~F組成的字符串,表示要轉換的十六進制正整數,每個十六進制數長度不超過100000。

輸出格式
  輸出n行,每行爲輸入對應的八進制正整數。

  【注意
  輸入的十六進制數不會有前導0,比如012A。
  輸出的八進制數也不能有前導0。

樣例輸入
  2
  39
  123ABC

樣例輸出
  71
  4435274

  提示
  先將十六進制數轉換成某進制數,再由某進制數轉換成八進制。

參考博客:https://blog.csdn.net/zhao2chen3/article/details/87813747

解題思路:

首先,不會有前導0的意思是十六進制、八進制的前面不會有多餘的0.比如十六進制對應二進制數的時候,每一位對應4位二進制數,如果沒有前導0,則當十六進制化成二進制不足4位時,前面不會補0.

十六進制化爲八進制
先用1化4方法,將十六進制化爲二進制;再用3並1方法,將二進制化爲8制。

#include <iostream> 
#include <algorithm>
#include <set> 

using namespace std;

typedef long long ll;
const ll maxn=1e5+7;

int main()
{
	freopen("input.txt","r",stdin);

	int n;
	cin>>n;
	while(n--)
	{
		string s,str="";
		cin>>s;	
		for(int i=0;i<s.length();i++)
		{
			if(s[i]=='0') str+="0000";
			else if(s[i]=='1') str+="0001";
			else if(s[i]=='2') str+="0010";
			else if(s[i]=='3') str+="0011";
			else if(s[i]=='4') str+="0100";
			else if(s[i]=='5') str+="0101";
			else if(s[i]=='6') str+="0110";
			else if(s[i]=='7') str+="0111";
			else if(s[i]=='8') str+="1000";
			else if(s[i]=='9') str+="1001";
			else if(s[i]=='A') str+="1010";
			else if(s[i]=='B') str+="1011";
			else if(s[i]=='C') str+="1100";
			else if(s[i]=='D') str+="1101";
			else if(s[i]=='E') str+="1110";
			else if(s[i]=='F') str+="1111";
		}
		if(str.length()%3==1) str="00"+str;
		else if(str.length()%3==2) str="0"+str;
		bool flag=0;
		for(int i=0;i<str.length();i+=3)
		{
			int p=(str[i]-'0')*2*2+(str[i+1]-'0')*2+str[i+2]-'0';
			if(p) flag=1;
			if(flag) cout<<p;
		}
		puts("");
	}
	
	return 0;
}

 

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