基础练习 十六进制转八进制

基础练习 十六进制转八进制  
时间限制:1.0s   内存限制:512.0MB
问题描述
  给定n个十六进制正整数,输出它们对应的八进制数。
输入格式
  输入的第一行为一个正整数n (1<=n<=10)。
  接下来n行,每行一个由0~9、大写字母A~F组成的字符串,表示要转换的十六进制正整数,每个十六进制数长度不超过100000。
输出格式
  输出n行,每行为输入对应的八进制正整数。
注意
  输入的十六进制数不会有前导0,比如012A。
  输出的八进制数也不能有前导0。
样例输入
2
39
123ABC
样例输出
71
4435274
提示
  先将十六进制数转换成某进制数,再由某进制数转换成八进制。


<pre name="code" class="cpp">#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
char s[100100]; 
int num[500010];
int main()
{
	int t;
	scanf("%d",&t);
	while(t--)
	{
		scanf("%s",s);
		int l=strlen(s);
		int j=0;
		for(int i=l-1;i>=0;i--)
		{
			if(s[i]=='A')
			{
				num[j++]=0,num[j++]=1;
				num[j++]=0,num[j++]=1;
			}
			else if(s[i]=='B')
			{
				num[j++]=1,num[j++]=1;
				num[j++]=0,num[j++]=1;
			}
			else if(s[i]=='C')
			{
				num[j++]=0,num[j++]=0;
				num[j++]=1,num[j++]=1;
			}
			else if(s[i]=='D')
			{
				num[j++]=1,num[j++]=0;
				num[j++]=1,num[j++]=1;
			}
			else if(s[i]=='E')
			{
				num[j++]=0,num[j++]=1;
				num[j++]=1,num[j++]=1;
			}
			else if(s[i]=='F')
			{
				num[j++]=1,num[j++]=1;
				num[j++]=1,num[j++]=1;
			}
			else
			{
				int g=j;
				int n=s[i]-'0';
				while(n)
				{
					num[j++]=n%2;
					n=n/2;
				}
				j=g+4;
			}
		}
		int e,d,h=0;
		for(int i=0;i<j;i+=3)
		{
			d=1;int n=0;
			for(e=i;e<i+3;e++)
			{
				n+=num[e]*d;
				d*=2;
			}
			num[h++]=n;
		}
		int k;
		for(k=h-1;k>=0;k--)
		if(num[k]!=0) 
		break;
		for(int i=k;i>=0;--i)
		printf("%d",num[i]);
		printf("\n");
		memset(num,0,sizeof(num));
		memset(s,'\0',sizeof(s)); 
	}
	return 0;
}



posted @ 2015-12-14 15:48  上弦月307  阅读(194)  评论(0编辑  收藏  举报