给定n个十六进制正整数,输出对应的八进制数

TOC

进制转换

问题描述

给定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;
}

运行结果如下:在这里插入图片描述

  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值