天天看點

十六進制轉化為八進制

十六進制轉化為八進制

剛開始想的是先把十六進制轉化為十進制,然後十進制再轉化為八進制,但是發現當資料量太大的時候,計算量太大,可能會逾時,是以這裡改為先轉化為二進制再轉化為八進制。

代碼:

#include<iostream>
#include<string>
using namespace std;
int main( )
{
	int n;
	cin>>n;
	for(int i=0;i<n;i++)
	{
		string a,b,c;
		cin>>a;
		for(int j=0;j<a.length();j++)
		{
			switch(a[j])
			{
				case '0': b+="0000"; break;
				case '1': b+="0001"; break;
				case '2': b+="0010"; break;
				case '3': b+="0011"; break;
				case '4': b+="0100"; break;
				case '5': b+="0101"; break;
				case '6': b+="0110"; break;
				case '7': b+="0111"; break;
				case '8': b+="1000"; break;
				case '9': b+="1001"; break;
				case 'A': b+="1010"; break;
				case 'B': b+="1011"; break;
				case 'C': b+="1100"; break;
				case 'D': b+="1101"; break;
				case 'E': b+="1110"; break;
				case 'F': b+="1111"; break;
				default: break;
			}
		}
		int len=b.length();
		if(len%3==1)
		{
			b="00"+b;
			len+=2;
		}
		else if(len%3==2)
		{
			b="0"+b;
			len++;
		}
		for(int k=0;k<len;k+=3)
		{
			int ans=(b[k]-'0')*4+(b[k+1]-'0')*2+(b[k+2]-'0');
			c+=(ans+'0'); 
		}
		int cnt=0;
		while(c[cnt]=='0') cnt++;
		for(int k=cnt;k<c.length();k++)
		cout<<c[k];
		cout<<endl;
	}
	return 0;
}