新手求大神指导——十六进制转八进制
问题描述:给定n个十六进制正整数,输出它们的八进制
数。
输入格式:
输入的第一行为一个正整数n (1<=n<=10).
接下来n行,每行一个由0^9、大写字母A~F组
成的字符串,表示要转换的十六进制正整数,每个十
六进制数长度不超过100000.
输出格式:
输出n行,每行为输入对应的八进制正整数。
注意:
输入的十六进制数不会有前导0,比如012A.
输出的八进制数也不能有前导0.
样例输入:
2
19
123ABC
样例输出:
71
4435274
提示:
先将十六进制数转换成某进制数,再由某进
制数转换成八进制。
自己写的代码如下,有哪些地方需要改进的?求大神们指点!
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
struct link
{
int eigth[150000];
int t;//第几位结束
struct link *next;
};
struct link *head, *this, *new;
int Toeigth(int ten);
int List();
int main(int argc, char *argv[])
{
int n;
scanf("%d", &n);
head = NULL;
this = NULL;
new = NULL;
char sixth[1000000];
int i, len;
for(i=1; i<=n; i++)
{
fflush(stdin);
len = 0;
char ch;
ch = getchar();
while(ch != '\n')
{
sixth[len] = ch;
ch = getchar();
len++;
}
len--;
int mid1 = 0;
int mid2 = 0;//放入输入的每个字符实际要表示的值
int j = 0;
while(len >= 0)
{
if((sixth[len] >= 48) && (sixth[len] <= 57))
mid2 = sixth[len] - 48;
else if((sixth[len] >= 65)&&(sixth[len] <= 90))
mid2 = sixth[len] - 55;
else
{
printf("error!\n");
return 0;
}
mid1 = mid1 + mid2*pow(16, j);
len--;
j++;
}
Toeigth(mid1);
}
List();
return 0;
}
int Toeigth(int ten)
{
new = (struct link*)malloc(sizeof(struct link));
new->next = NULL;
new->t = 0;
int yu, shan;
shan = -1;
while(shan != 0)
{
yu = ten%8;
shan = ten/8;
new->eigth[new->t] = yu;
ten = shan;
new->t++;
}
new->t--;
if(head == NULL)
head = new;
else
{
this = head;
while(this->next != NULL)
this = this->next;
this->next = new;
}
return 0;
}
int List()
{
this = head;
while(this->next != NULL)
{
while(this->t >= 0)
{
printf("%d", this->eigth[this->t]);
this->t--;
}
this = this->next;
printf("\n");
}
while(this->t >= 0)
{
printf("%d", this->eigth[this->t]);
this->t--;
}
return 0;
}