R6-3 用链栈实现将非负的十进制数转换为指定的进制数【有题解视频,可本地编译器调试】

利用链序栈将输入的非负的十进制数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);

函数参数说明:形参--sdecscale,其中,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

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值