进制转换
问题描述
给定n个十六进制正整数,输出它们对应的八进制数。
要求
输入格式:输入的第一行为一个正整数n (1<=n<=10)。
接下来n行,每行一个由0-9
、大写字母A~F组成的字符串,表示要 转换的十六进制正整数,每个十六进制数长度不超过100000。
输出格式:输出n行,每行为输入对应的八进制正整数。
分析
要将十六进制转换成八进制需要先将十六进制转换成十进制,再将十进制转换为八进制。转换过程如下图:
由十进制转换八进制可以看出先得到的数为低位,所以这里将八进制的数先推入栈中,待得到结果后再依次弹出。
#define _CRT_SECURE_NO_WARNINGS //不定义这个scanf总报错
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
#define MAXSIZE 1024
#define INFINITY 65535
//定义一个栈存放八进制数
typedef struct SeqStack_1{
int data[MAXSIZE];
int top;
}SeqStack;
int IsEmpty(SeqStack* stack) { //判断栈是否为空
if (stack->top == -1)
return 1;
else
return 0;
}
void InitStack(SeqStack* stack) { //栈的初始化
stack->top = -1;
}
void SeqStack_Push(SeqStack* stack, int val) { //将数据压入栈中
if (stack->top >= MAXSIZE - 1)
return;
stack->top++;
stack->data[stack->top] = val;
}
int SeqStack_Pop(SeqStack* stack) { //弹出栈
if(!IsEmpty(stack))
return stack->data[stack->top--];
return INFINITY;//返回无穷大
}
int main() {
int n,len, sum = 0, num, ten;
printf("请输入要输入数的个数:");
scanf_s("%d ", &n);
if (n > 10) {
printf("输入参数有误!");
return 0;
}
char a[10][100000];//定义一个二位数组存放字符串
int b[10];
for (int i = 0; i < n; i++) { //确定要转换的个数
scanf("%s", a[i]);
}
printf("十进制数为:\n");
for (int i = 0; i < n; i++) { //取某一个字符串
len = strlen(a[i]);
for (int j = 0; j < len; j++) { //读取一个字符串中的具体值
switch (a[i][j]) {
case'A':num = 10; break;
case'B':num = 11; break;
case'C':num = 12; break;
case'D':num = 13; break;
case'E':num = 14; break;
case'F':num = 15; break;
default:num = (int)a[i][j]-48; break;//直接强制类型转出的时ASCII码,故减去48
}
sum = sum + num * (int)pow(16, len - j - 1);//十六进制转化为十进制
}
b[i] = sum;
sum = 0;
printf("%d \n", b[i]);
}
printf("八进制数为:\n");
//将十进制转换为八进制
SeqStack stack; //定义栈
InitStack(&stack);//初始化栈
for (int i = 0; i < n; i++) {
ten = b[i];
while (ten != 0) { //十进制转换至八进制,并将数据压入栈
SeqStack_Push(&stack, ten % 8);
ten = ten / 8;
}
while ((&stack)->top >= 0) {
printf("%d", SeqStack_Pop(&stack));//依次弹出栈
}
InitStack(&stack);
printf("\n");
}
return 0;
}
运行结果如下: