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

交付清单

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)

/*栈实现进制转化
 *十进制最大转化为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

如下:

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;
}

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

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

python 不是有包吗


#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);
    }
}

可以这样搞:

步骤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