C语言用栈完成数制转换(整数)

348 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第4天,点击查看活动详情

1、辗转相除法

数制转换一般使用辗转相处的方法,例如将十进制10转化为二进制数:

image.png

转换的结果为 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);
}