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

问题描述
  给定n个十六进制正整数,输出它们对应的八进制数。

输入格式
  输入的第一行为一个正整数n (1<=n<=10)。
  接下来n行,每行一个由0~9、大写字母A~F组成的字符串,表示要转换的十六进制正整数,每个十六进制数长度不超过100000。

输出格式
  输出n行,每行为输入对应的八进制正整数。

  【注意
  输入的十六进制数不会有前导0,比如012A。
  输出的八进制数也不能有前导0。

样例输入
  2
  39
  123ABC

样例输出
  71
  4435274

  提示
  先将十六进制数转换成某进制数,再由某进制数转换成八进制。

本来打算先将十六进制转换成十进制数,再由十进制数转换成八进制,试了多次发现行不通(数字太大超过 unsigned long long范围),十六进制转换成十进制数,再由十进制数转换成八进制代码如下:

#include<stdio.h>
#include<math.h>
#include<string.h>
int main()
{
	int n,i,num,j;
	int temp,a[100];
	int count=1,num1=0;
	char str1[100000];
	unsigned long long sum=0;
	
	scanf("%lld",&n);
	for(i=1;i<=n;i++)
	{
		sum=0,count=1,num1=0;
		scanf("\n");
		strcpy(str1," ");
		gets(str1);
		temp=strlen(str1);
		for(j=0;j<=strlen(str1);j++)
		{
				
			if(str1[j]>='A'&&str1[j]<='F')
			{
				str1[j]=str1[j]-'A'+10;
			}
			else if(str1[j]>='0'&&str1[j]<='9')
			{
				str1[j]=str1[j]-'0';
			}
			sum+=str1[j]*pow(16,temp-1);
			temp=temp-1;
		}
		j=0;
		while(sum)
		{
			a[j]=sum%8;
			sum=sum/8;
			j++;
		}
		for(j=j-1;j>=0;j--)
		{
			printf("%d",a[j]);
		}
	}
	return 0;	
} 

十六进制转换成二进制数,再由二进制数转换成八进制代码如下: