m0_71886717 2022-06-10 16:31 采纳率: 100%
浏览 303
已结题

算法与数据结构 进制转换问题

交付清单

img


数制转换问题
问题描述:进制数制是人们利用符号进行计数的科学方法。数制有很多种,在计算机中常用的数制有:十进制,二进制、八进制和十六进制。十六进制数有两个基本特点:它由十六个字符0~9以及A,B,C,D,E,F组成(它们分别表示十进制数0~15),十六进制数运算规律是逢十六进一,例如:十六进制数4AC8可写成(4AC8)16,或写成4AC8H。
要求:
1.输入一个十进制数N,将它转换成R进制数输出
2.输入数据包含多个测试实例,每个测试实例至少包含两个整数N和R(R为2、8、16)

  • 写回答

7条回答 默认 最新

  • 白驹_过隙 算法领域新星创作者 2022-06-10 16:41
    关注
    /*栈实现进制转化
     *十进制最大转化为36进制用10(A)-35(Z)表示
    */
    #include<stdio.h>
    #include<malloc.h>
    #include<stdlib.h>
    
    #define STACK_INIT_SIZE 10 //栈的初始空间
    #define STACKINCREMENT 5   //追加的存储空间
    
    //结构体
    typedef struct {
        int *base;
        int *top;
        int stacksize;
    }Stack;
    
        //Create static
    void InitStack(Stack *s){
        s->base = (int *)malloc(sizeof(int)*STACK_INIT_SIZE);
        if(!s->base){  //申请存储空间失败,直接退出
            exit(0);
        }
        s->top = s->base;
        s->stacksize = STACK_INIT_SIZE;
    }
    
    //Insert function
    void Push(Stack *s,int e){
        if(s->top-s->base>STACK_INIT_SIZE){//若栈已满,追加存储空间
            s->base = (int *)malloc(sizeof(int)*(STACK_INIT_SIZE+STACKINCREMENT));
            if(!s->base){
                exit(0);
            }
            s->top = s->base+s->stacksize;    //栈顶指针发生变化
            s->stacksize += STACKINCREMENT;   //存储空间发生变化
        }
        *++s->top = e;//栈顶指针先加一,然后赋值
    }
    
    //main function
    main(){
        Stack S;
        int n,m;        //n进制数,m基数
        InitStack(&S);
        while(1){    //方便多次测试程序,可以省略
    
        printf("请输入十进制整数以及转换的进制数:");
        scanf("%d %d",&n,&m);
        int s = n; //保存n的数值
    
        if(m>36){
            printf("输入的基数不满足条件,退出程序");
            return 0;
        }
        printf("十进制%d转化成%d进制结果为:",s,m);
        if(n<0){       //若为负数,添加负号
            n = abs(n);//负数取绝对值
            printf("-");
        }
        while(n){
            Push(&S,n%m);//十进制数取余入栈
            n/=m;
        }
        while(S.top!=S.base){//若栈不为空,继续循环出栈
            if(*S.top<=9){
                printf("%d",*S.top--);//数字直接取值,然后栈顶指针减一
            }
            else {//if(*S.top>9&&*S.top<=36){
                printf("%c",*S.top+55);
                S.top--;
            }
        }
        printf("\n");
        }//对应while(1),可以省略
    }
    
    

    img

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(6条)

报告相同问题?

问题事件

  • 系统已结题 6月22日
  • 已采纳回答 6月14日
  • 创建了问题 6月10日

悬赏问题

  • ¥15 maccms影视模板 制作影视网站失败 求
  • ¥15 stm32按键设置闹钟数进退位不正常
  • ¥15 三电平逆变器中点电位平衡问题
  • ¥20 这怎么写啊 java课设
  • ¥15 用C语言完成一个复杂的游戏
  • ¥15 如何批量更改很多个文件夹里的文件名中包含文件夹名?
  • ¥50 MTK手机模拟HID鼠标出现卡顿
  • ¥20 求下下面这个数据结构代码
  • ¥20 前端 二进制文件流图片转化异常
  • ¥15 github上的这个C语言项目如何跑起来