顺序栈进制转换
栈可以非常方便地用于进制转换,其基本思想如下:
对于任意一个数,无论是什么进制,它的每一位都是由该进制下的基数的幂次方组成的,例如十进制数 1234,它的每一位可以表示为:
1 × 10³ + 2 × 10² + 3 × 10¹ + 4 × 10⁰
因此,将一个数从一种进制转换到另一种进制,可以分成两步:
将原数转换为十进制数。
将十进制数转换为目标进制数。
其中第一步可以用一些常用的公式来实现,例如对于一个n进制的数num(num[n-1]表示最高位,num[0]表示最低位),其转换为十进制数的公式为:
num[0] × n⁰ + num[1] × n¹ + … + num[n-1] × n^(n-1)
第二步可以用栈来实现,具体思路是:
用目标进制数base去除十进制数,将余数压入栈中。
将十进制数除以目标进制数,重复步骤1,直到十进制数为0。
从栈底到栈顶依次出栈,输出每个余数,即为目标进制下的数。
需要注意的是,在第二步中,如果余数小于10,则直接输出数字;如果余数大于等于10,则需要输出对应的字母。
综上所述,栈是一种非常适合用于进制转换的数据结构,可以方便地将一个数从一种进制转换为另一种进制。
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAXSIZE 100
typedef struct {
int data[MAXSIZE];
int top;
} SeqStack;
// 初始化栈
void InitStack(SeqStack* s) {
s->top = -1;
}
// 判断栈是否为空
int IsEmpty(SeqStack* s) {
if (s->top == -1) {
return 1;
}
else {
return 0;
}
}
// 判断栈是否已满
int IsFull(SeqStack* s) {
if (s->top == MAXSIZE - 1) {
return 1;
}
else {
return 0;
}
}
// 元素入栈
void Push(SeqStack* s, int value) {
if (IsFull(s)) {
printf("Stack overflow!\n");
exit(1);
}
s->top++;
s->data[s->top] = value;
}
// 元素出栈
int Pop(SeqStack* s) {
if (IsEmpty(s)) {
printf("Stack underflow!\n");
exit(1);
}
int value = s->data[s->top];
s->top--;
return value;
}
// 获取栈顶元素
int GetTop(SeqStack* s) {
if (IsEmpty(s)) {
printf("Stack is empty!\n");
exit(1);
}
return s->data[s->top];
}
// 将一个任意进制数转换为十进制数
int OtherToDec(char* num, int base) {
int dec = 0;
int len = strlen(num);
for (int i = 0; i < len; i++) {
int digit = num[i] - '0';
if (digit >= 10) {
digit = num[i] - 'A' + 10;
}
dec = dec * base + digit;
}
return dec;
}
// 将十进制数转换为任意进制数
void DecToOther(int dec, int base) {
SeqStack s;
InitStack(&s);
while (dec > 0) {
Push(&s, dec % base);
dec /= base;
}
while (!IsEmpty(&s)) {
int digit = Pop(&s);
if (digit < 10) {
printf("%d", digit);
}
else {
printf("%c", digit - 10 + 'A');
}
}
}
// 将一个任意进制数转换为另一个任意进制数
void OtherToOther(char* num, int src_base, int dst_base) {
int dec = OtherToDec(num, src_base);
DecToOther(dec, dst_base);
}
int main() {
char num[MAXSIZE];
int src_base, dst_base;
printf("Please input a number: ");
scanf("%s", num);
printf("Please input the source base: ");
scanf("%d", &src_base);
printf("Please input the destination base: ");
scanf("%d", &dst_base);
printf("Result: ");
OtherToOther(num, src_base, dst_base);
printf("\n");
return 0;
}
- 感谢你赐予我前进的力量
赞赏者名单
因为你们的支持让我意识到写文章的价值🙏
本文是原创文章,采用 CC BY-NC-ND 4.0 协议,完整转载请注明来自 咕噜
评论
匿名评论
隐私政策
你无需删除空行,直接评论以获取最佳展示效果