题目
给定n个十六进制正整数,输出它们对应的八进制数。
输入
输入的第一行为一个正整数n (1<=n<=10)。接下来n行,每行一个由09、大写字母AF组成的字符串,表示要转换的十六进制正整数,每个十六进制数长度不超过100000。
输出
输出n行,每行为输入对应的八进制正整数。
【注意】
输入的十六进制数不会有前导0,比如012A。
输出的八进制数也不能有前导0。
样例输入
2
39
123ABC
样例输出
71
4435274
解题思路
首先将16进制转为10进制,再将10进制转为8进制。
代码
#include<stdio.h>
#include<string.h>
#include<math.h>
long int c16to10(char a[]){
int lena = strlen(a);
int i,temp;
long int num;
for (i=0;i<lena;i++)
{
if (a[i]>64) //是字母
temp = a[i]-55;
else //是数字
temp = a[i]-48;
num+=(pow(16,lena-i-1)*temp);
}
return num;
}
void c10to8(long int a){
int b[300];
int i,k = 0;
int has_printed = 0;
if (a<8)
printf("%ld",a);
else
{
while(a/8!=0)
{
b[k++] = a%8;
a/=8;
}
b[k] = a;
for (i=k;i>=0;i--)
{
if (b[i]==0 && has_printed==0)
continue;//前面的0不输出
else
{
printf("%d",b[i]);
has_printed = 1;
}
}
}
}
int main()
{
int n,i,len;
char temp[100];
scanf("%d",&n);
for (i=0;i<n;i++)
{
scanf("%s",&temp);
getchar();//读入换行符
c10to8(c16to10(temp));
printf("\n");
}
return 0;
}