利用链序栈将输入的非负的十进制数N转换为指定的d(二、八或十六)进制数。
个人学习答案:
int DecimalConvert(LinkStack s, int dec, int scale) {
// 判断进制是否合法
if (scale != 2 && scale != 8 && scale != 16) {
return 0; // 进制不合法,返回0
}
// 清空栈
while (!LinkStackEmpty(s)) {
DataType tmp;
LinkStackPop(s, &tmp); // 弹出栈顶元素
}
// 转换过程
while (dec > 0) {
LinkStackPush(s, dec % scale); // 将余数压入栈
dec /= scale; // 更新dec为除法的结果
}
return 1; // 转换成功,返回1
}
链栈的定义如下:
typedef struct SNode
{
DataType data; // 数据域
struct SNode *next; // 指向后继结点的指针域
}SNode,*LinkStack;
函数接口定义:
int DecimalConvert(LinkStack s, int dec, int scale);
函数参数说明:形参--s
、dec
、scale
,其中,s
是存放转换后的scale进制数的各位数字,dec
主函数输入的待转换的十进制数,scale
是指定的数制(只能是2、8或16)。 函数返回值:1
,表示函数执行完成;0
,表示函数未成功执行。
裁判测试程序样例:
#include <stdio.h>
#include <stdlib.h>
typedef int DataType;
typedef struct SNode
{
DataType data; // 数据域
struct SNode* next; // 指向后继结点的指针域
}SNode, * LinkStack;
int InitLinkStack(LinkStack* top)
{ /* 初始化链栈 */
*top = (LinkStack)malloc(sizeof(SNode));
if (*top == NULL)
{
printf("初始化链栈出错");
return 0;
}
(*top)->next = NULL;
return 1;
}
int LinkStackEmpty(LinkStack top)
{ /* 判栈空函数 */
if (top->next == NULL)
return 1;
else
return 0;
}
int LinkStackPush(LinkStack top, DataType e)
{ /* 压栈函数 */
SNode* p;
p = (SNode*)malloc(sizeof(SNode));
if (!p)
{
printf("入栈操作出错!\n");
return 0;
}
p->data = e;
p->next = top->next;
top->next = p;
return 1;
}
int LinkStackPop(LinkStack top, DataType* e)
{ /* 弹栈函数 */
SNode* p;
if (!top->next)
{
printf("栈已空,无法完成出栈操作!\n");
return 0;
}
p = top->next;
top->next = p->next;
*e = p->data;
free(p);
return 1;
}
/* 本题要求函数 */
int DecimalConvert(LinkStack s, int dec, int scale);
int main()
{
LinkStack s;
char ch[] = "0123456789ABCDEF"; //二、八、十六进制所使用的数字
unsigned dec, scale;
DataType tmp;
InitLinkStack(&s);
scanf("%d %d", &dec, &scale); // 某些编译器要求此处改为scanf_s
if (DecimalConvert(s, dec, scale))
{
printf("十进制数:%d,转换为:%d进制数,结果为:", dec, scale);
while (!LinkStackEmpty(s))
{
LinkStackPop(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