持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第4天,点击查看活动详情
1、辗转相除法
数制转换一般使用辗转相处的方法,例如将十进制10转化为二进制数:
转换的结果为 1010 ,正好是依次辗转相除得到的结果 0 1 0 1 逆序输出的结果,而栈的特点就是“先进后出”,所以可以利用栈实现数制转换,而确实十进制对任意十以内进制的转换(因为更高进制数需要大写英文字母进行延申,比如十六进制数(1、2、···、9、A、···、F)分别代表十进制数1~15,任意两非十进制之间的转换可以以十进制数为中介进行相互转换。
2、代码实现
1、算法介绍
思路:
1)、初始化栈,初始化N为要转换的数,r为进制数;
2)、判断N的值,为0转为步骤(4),否则N%r压入栈S中;
3)、用N/r代替N转入步骤(2);
4)、出栈,出栈序列即为结果;
int conversion(int n, int r)//r:进制数基数 n:要转换的数
{
PSeqStack S;//定义一个栈
DataType x;//定义一个数据节点
if (!r)
{
printf("基数不能为0!\n");
return 0;
}
S = Init_SeStack();//对栈进行初始化
if (!S) {
printf("栈初始化失败!\n");
return 0;
}
while (n)
{
Push_SeqStack(S, n%r);//取余,依次压入栈内
n = n / r;//取整
}
//while (!Empty_SeqStack(S))
//{
// Pop_SeqStack(S, &x);
// //printf("%d", x);//
//}
Print_SeqStack(S);
Destroy_SeqStack(&S);
}
2、运行及测试
主函数;
int main()
{
int N ;
printf("请分别输入一个十进制数,和一个非零基数!\n");
scanf_s("%d", &N);
int n;
scanf_s("%d", &r);
printf("十进制数%d对应的%d进制数为",N, r);
conversion(N,r);
}
测试结果:
请分别输入一个十进制数,和一个非零基数!
100 8
十进制数100对应的8进制数为144
3、总结
当应用程序中需要一个数据保存时顺序相反的数据时,通常使用栈。用顺序栈的情况比较多。
4、完整代码
//顺序表栈实现数置转换
#include "stdio.h"
#include "stdlib.h"
#define MAXSIZE 100
typedef int DataType;
//定义结构体
typedef struct
{
DataType data[MAXSIZE];
int top;
}SeqStack, *PSeqStack;
//初始化空栈
PSeqStack Init_SeStack()
{
PSeqStack S;
S = (PSeqStack)malloc(sizeof(SeqStack));
if (S)
S->top = -1;
return S;
}
//判断空栈
int Empty_SeqStack(PSeqStack S)
{
if (S->top == -1)
return 1;
else
return 0;
}
//入栈
int Push_SeqStack(PSeqStack S, DataType x)
{
if (S->top == MAXSIZE - 1)
return 0;//栈已满,不能入栈
else
{
S->top++;
S->data[S->top] = x;
return 1;
}
}
//出栈
int Pop_SeqStack(PSeqStack S, DataType *x)
{
if (Empty_SeqStack(S))
return 0;//空栈,不能能出栈
else {
*x = (S->data[S->top]);
S->top--;
return 1;
}
}
//取栈顶元素
int GetTop_SeqStack(PSeqStack S, DataType *x)
{
if (Empty_SeqStack(S))
return 0;//空栈,不能出栈
else {
*x = S->data[S->top];
return 1;
}
}
//销毁栈
void Destroy_SeqStack(PSeqStack *S)
{
if (*S)
free(*S);
*S = NULL;
return;
}
//打印栈
int Print_SeqStack(PSeqStack S)
{
if (Empty_SeqStack(S))
return 0;//空栈,不能打印
else {
//printf("打印全栈\n");
for (int i = S->top; i >= 0; i--) {
printf("%d", S->data[i]);
}
return 1;
}
}
//数值转换问题
int conversion(int n, int r)//r:进制数基数 n:要转换的数
{
PSeqStack S;//定义一个栈
DataType x;//定义一个数据节点
if (!r)
{
printf("基数不能为0!\n");
return 0;
}
S = Init_SeStack();//对栈进行初始化
if (!S) {
printf("栈初始化失败!\n");
return 0;
}
while (n)
{
Push_SeqStack(S, n%r);//取余,依次压入栈内
n = n / r;//取整
}
//while (!Empty_SeqStack(S))
//{
// Pop_SeqStack(S, &x);
// //printf("%d", x);
//}
Print_SeqStack(S);
Destroy_SeqStack(&S);
}
int main()
{
int a ;
printf("请分别输入一个十进制数,和一个非零基数!\n");
scanf_s("%d", &a);
int n;
scanf_s("%d", &n);
printf("十进制数%d对应的%d进制数为",a, n);
conversion(a,n);
}