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

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

交付清单

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

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
  • qfl_sdu 2022-06-10 16:47
    关注

    如下:

    2进制后缀B
    8进制后缀O
    16进制后缀H
    10进制转2进制例子

    img

    10进制转8进制例子

    img

    10进制转16进制例子

    img

    #define _CRT_SECURE_NO_WARNINGS 1
    #include <stdio.h>
    
    //10进制转radius进制
    void trans(int n, int radius, char buf[])
    {
        int i = 0;
        int t, j;
        char ch;
        while (n)
        {
            t = n % radius;
            if (t >= 10)
                buf[i] = 'A' + t - 10;
            else
                buf[i] = '0' + t;
            i++;
            n /= radius;
        }
        buf[i] = 0;
    
        //逆序
        for (j = 0, t = i - 1; j < t; j++, t--)
        {
            ch = buf[j];
            buf[j] = buf[t];
            buf[t] = ch;
        }
        
    
    }
    
    int main()
    {
        int n, R;
        char buf[20];
        scanf("%d %d", &n, &R);
        trans(n, R, buf);
        if (R == 2)
            printf("%sB\n", buf);
        else if (R == 8)
            printf("%sO\n", buf);
        else if (R == 16)
            printf("%sH\n", buf);
        else
            printf("%s\n", buf);
        return 0;
    }
    
    
    评论 编辑记录
  • FlyingPig_chen 2022-06-10 17:06
    关注
    num = int(input("请输入一个整数:"))
    
    
    def decToHex(number):
        hexStr = ""
        while number != 0:
            temp = number % 16
            if temp < 10:
                hexStr = str(temp) + hexStr
            else:
                hexStr = chr(55 + temp) + hexStr
            number //= 16  # number = number // 16
        return "({})16".format(hexStr.upper())
    
    
    def decToOct(number):
        hexStr = ""
        while number != 0:
            temp = number % 8
            if temp < 10:
                hexStr = str(temp) + hexStr
            else:
                hexStr = chr(55 + temp) + hexStr
            number //= 8
        return "({})8".format(hexStr.upper())
    
    
    def decToBin(number):
        hexStr = ""
        while number != 0:
            temp = number % 2
            if temp < 10:
                hexStr = str(temp) + hexStr
            else:
                hexStr = chr(55 + temp) + hexStr
            number //= 2
        return "({})2".format(hexStr.upper())
    
    
    print("十进制数%d,对应的十六进制数是%s" % (num, decToHex(num)))
    
    # print("转换为八进制为:", oct(num))
    print("十进制数%d,转换为八进制为:%s" % (num, decToOct(num)))
    
    # print("转换为二进制为:", bin(num))
    print("十进制数%d,转换为二进制为:%s" % (num, decToBin(num)))
    

    img

    img

    评论
  • 卷积神经网络 2022-06-10 20:23
    关注

    这不很简单么,有没有说用那种语言实现?

    评论
  • 东方佑 2022-06-11 15:27
    关注

    python 不是有包吗

    评论
  • 中考之前不改名 2022-06-11 21:50
    关注
    
    #include<stdio.h>
    void binary(int, int);
    
    int main()
    {
        int N, R;
        while(scanf("%d %d", &N, &R)!=EOF)
        {
            if(N==0)
                printf("%d",0);
            else if(N<0)
            {
                printf("-");
                N=-N;
            }
            binary(N, R);
            printf("\n");
        }
        return 0;
    }
    
    void binary(int n, int r)
    {
        int m;
        if(n==0)
            return;
        else
        {
            binary(n/r, r);
            m=n%r;
            if(m<10)
                printf("%d", m);
            else
                printf("%c", 'A'+m-10);
        }
    }
    

    评论
  • zxy2847225301 2022-06-14 13:39
    关注

    可以这样搞:

    步骤1: 先确认十进制数N转换为R进制有多少位?如:R的1次方是否小于N,如果小于,则判断R的2次方是否小于N,如果还小于,则继续递增R的次方数,直到R的x次方大于或者等于R,如果R的x次方刚好等于N,则直接得出结果(如:x=2时,结果为10),如果是大于R,则得出的位数为x-1,并转入步骤2
    步骤2:在步骤1中得出位数为x-1【记R的(x-1)次方为A1, R的(x-2)次方为A2,R的(x-3)次方为A3】 则x-1位对应的数值计算为:N除以A1;x-2位为(N-A1)/A2;x-3位为(N-A1-A2)/A3; 第1位的值为N对R求余

    例子:

    10进制数219转为6进制

    i:先确认有多少位。
    6的一次方 61=6<219
    6的平方 6*6=36<219
    6的3次方6*6*6=<219
    6的4次方 6*6*6*6=1296>219
    所以确认最大位数为3
    ii: 求第3位的值: 219/(6
    66)=1
    第2位为:(219-6
    66)/(66)=0
    第1位为:219%6=3
    最终结果为:103

    评论 编辑记录
查看更多回答(6条)

报告相同问题?

问题事件

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

悬赏问题

  • ¥20 arcgis制做交通拥堵时变图
  • ¥15 AD20 PCB板步线 这个要怎么步啊
  • ¥50 关于《奇迹世界》1.5版本,数据修改
  • ¥15 请问这个问题如何解决(关键词-File)
  • ¥50 visual studio 2022和EasyX图形化界面
  • ¥15 找一下报错原因,纠正一下
  • ¥50 Cox回归模型Nomogram图制作报错
  • ¥20 SQL如何查询多级用户的数据
  • ¥15 给车牌识别代码加一个识别轮廓长宽比的代码
  • ¥30 商品价格预测的transformer模型优化