十六进制转八进制

题目链接:http://lx.lanqiao.org/problem.page?gpid=T51

//因为每个十六进制的最大长度不超过十万,所以测试样例的最大肯定是十万,
//所以我们不能将十六进制转换成十进制再转换成八进制,那样会溢出,所以打算转换成二进制 
#include<iostream>
#include<string>
using namespace std;
int main()
{
	int n,str_len,a[1000000],j,i;
	string str,str_1;
	while(cin>>n)
	{
		while(n--)
		{
			cin>>str;
			str_len=str.length();
			str_1="";
			//将十六进制转换成二进制。 
			for(j=0;j<str_len;j++)
			{
				switch(str[j])
				{
				case '0':str_1+="0000";break;
    			case '1':str_1+="0001";break;
      			case '2':str_1+="0010";break;
   				case '3':str_1+="0011";break;
      			case '4':str_1+="0100";break;
      			case '5':str_1+="0101";break;
    			case '6':str_1+="0110";break;
      			case '7':str_1+="0111";break;
      			case '8':str_1+="1000";break;
      			case '9':str_1+="1001";break;
      			case 'A':str_1+="1010";break;
      			case 'B':str_1+="1011";break;
      			case 'C':str_1+="1100";break;
      			case 'D':str_1+="1101";break;
      			case 'E':str_1+="1110";break;
      			case 'F':str_1+="1111";break;
      			default:break;
				}
			}
			//修正位数,使得转换后的二进制能够正好3个一组转换成8进制
			if(str_1.length()%3==1)
				str_1="00"+str_1;
			else if(str_1.length()%3==2)
				str_1="0"+str_1;
			//将二进制转换成八进制
			i=0;
			 for(j=0;j<str_1.length()-1;j=j+3)
		    {
				a[i]=(str_1[j]-'0')*4+(str_1[j+1]-'0')*2+(str_1[j+2]-'0')*1;//每3个一组 
				i++; 
			}
			for(j=0;j<i;j++)
			{
				if(a[j]==0&&j==0)	//不输出前导0 
					continue;
				else
					cout<<a[j];
			 }	 
			 cout<<endl;			
		}
	}
	return 0;
	
} 


你可能感兴趣的:(十六进制转八进制)