编辑代码

#include <stdio.h>  
#include <stdlib.h>  
#include <string.h>  
#include <stdbool.h>  
  
#define MAX_SIZE 100 // 栈的最大容量  
  
// 定义顺序栈结构体  
typedef struct {  
    int data[MAX_SIZE]; // 栈的存储空间  
    int top; // 栈顶指针  
} SeqStack;  
  
// 初始化栈  
void InitStack(SeqStack *s) {  
    s->top = -1;  
}  
  
// 判断栈是否为空  
bool StackEmpty(SeqStack *s) {  
    return s->top == -1;  
}  
  
// 入栈  
bool Push(SeqStack *s, int e) {  
    if (s->top == MAX_SIZE - 1) {  
        return false; // 栈满,无法入栈  
    }  
    s->data[++s->top] = e;  
    return true;  
}  
  
// 出栈  
bool Pop(SeqStack *s, int *e) {  
    if (StackEmpty(s)) {  
        return false; // 栈空,无法出栈  
    }  
    *e = s->data[s->top--];  
    return true;  
}  
  
// 十进制转m进制  
void DecimalToBaseM(int decimal, int base, char *result) {  
    SeqStack s;  
    InitStack(&s);  
    int remainder;  
  
    // 转换十进制数为m进制,并将余数入栈  
    while (decimal > 0) {  
        remainder = decimal % base;  
        Push(&s, remainder);  
        decimal /= base;  
    }  
  
    // 弹出栈中元素,构造m进制字符串  
    int index = 0;  
    while (!StackEmpty(&s)) {  
        Pop(&s, &remainder);  
        if (remainder < 10) {  
            result[index++] = '0' + remainder;  
        } else {  
            result[index++] = 'A' + (remainder - 10);  
        }  
    }  
    result[index] = '\0'; // 添加字符串结束符  
  
    // 反转字符串,因为栈是后进先出的结构  
    for (int i = 0; i < index / 2; i++) {  
        char temp = result[i];  
        result[i] = result[index - 1 - i];  
        result[index - 1 - i] = temp;  
    }  
}  
  
int main() {  
    int decimal, base;  
    char result[MAX_SIZE];  
  
    printf("请输入一个十进制整数: ");  
    scanf("%d", &decimal);  
    printf("请输入转换的进制数m (2-16): ");  
    scanf("%d", &base);  
  
    if (base < 2 || base > 16) {  
        printf("进制数必须在2到16之间。\n");  
        return 1;  
    }  
  
    DecimalToBaseM(decimal, base, result);  
    printf("转换后的%d进制数为: %s\n", base, result);  
  
    return 0;  
}