利用顺序栈将输入的非负的十进制数N转换为指定的d(二、八或十六)进制数。
学习答案:
int DecimalConvert(SqStack* s, int dec, int scale)
{
// 判断进制是否合法
if (scale != 2 && scale != 8 && scale != 16)
{
return 0; // 进制不合法,返回0
}
// 清空栈
while (!SqStackEmpty(*s))
{
DataType tmp;
SqStackPop(s, &tmp); // 弹出栈顶元素
}
// 转换过程
while (dec > 0)
{
SqStackPush(s, dec % scale); // 将余数压入栈
dec /= scale; // 更新dec为除法的结果
}
return 1; // 转换成功,返回1
}
顺序栈的定义如下:
#define STACKSIZE 100
typedef int DataType;
typedef struct
{
DataType items[STACKSIZE]; /*存放栈中元素的一维数组*/
int top; /*用来存放栈顶元素的下标*/
}SqStack;
函数接口定义:
int DecimalConvert(SqStack *s, int dec, int scale);
函数参数说明:形参--s
、dec
、scale
,其中,s
是存放转换后的scale进制数的各位数字,dec
主函数输入的待转换的十进制数,scale
是指定的数制(只能是2、8或16)。 函数返回值:1
,表示函数执行完成;0
,表示函数未成功执行。
裁判测试程序样例:
#include <stdio.h>
#include <stdlib.h>
#define STACKSIZE 100
typedef int DataType;
typedef struct
{
DataType items[STACKSIZE]; /*存放栈中元素的一维数组*/
int top; /*用来存放栈顶元素的下标*/
}SqStack;
int InitSqStack(SqStack* S)
{ // 初始化顺序栈
S->top = -1;
return 1;
}
int SqStackPush(SqStack* S, DataType e)
{ // 压栈函数
if (S->top == STACKSIZE - 1)
return 0; /*栈已满*/
S->top++;
S->items[S->top] = e;
return 1;
}
int SqStackPop(SqStack* S, DataType* e)
{ /* 将栈S的栈顶元素弹出,放到e所指的存储空间中 */
if (S->top == -1) /* 栈为空 */
return 0;
*e = S->items[S->top]; /* 将栈顶元素带回来 */
S->top--; /* 修改栈顶指针 */
return 1;
}
int SqStackEmpty(SqStack S)
{ /* S为顺序栈 */
if (S.top == -1)
return 1;
else
return 0;
}
/* 本题要求函数 */
int DecimalConvert(SqStack* s, int dec, int scale);
int main()
{
SqStack s;
char ch[] = "0123456789ABCDEF"; //二、八、十六进制所使用的数字
unsigned dec, scale;
DataType tmp;
InitSqStack(&s);
scanf("%d %d", &dec, &scale); // 某些编译器要求此处改为scanf_s
if (DecimalConvert(&s, dec, scale))
{
printf("十进制数:%d,转换为:%d进制数,结果为:", dec, scale);
while (!SqStackEmpty(s))
{
SqStackPop(&s, &tmp);
printf("%c", ch[tmp]);
}
}
else
printf("数制转换未成功!");
return 0;
}
/* 请在这里填写答案 */
输入样例:
20 2
输出样例:
十进制数:20,转换为:2进制数,结果为:10100
输入样例:
20 8
输出样例:
十进制数:20,转换为:8进制数,结果为:24
输入样例:
20 16
输出样例:
十进制数:20,转换为:16进制数,结果为:14
代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB