R6-2 用顺序栈实现将非负的十进制数转换为指定的进制数【可本地编译器调试】

该文章介绍了一个C语言函数intDecimalConvert,用于将非负十进制数转换为二、八或十六进制,利用顺序栈存储每一位转换结果。函数首先检查进制的合法性,然后清空栈并进行转换过程,最后返回转换结果。
摘要由CSDN通过智能技术生成

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值