在Visual Studio调试通过
代码:
#define _CRT_SECURE_NO_WARNINGS
//十进制整数转化为R进制整数算法
#include <stdlib.h>
#include<stdio.h>
#define MAXSIZE 100
typedef struct {
int data[MAXSIZE];
int top;
}SeqStack, *PSeqStack;
float X;
int R;
void NumConvert(int X, int R);
PSeqStack Init_SeqStack(PSeqStack S);
int Empty_SeqStack(PSeqStack S);
int Push_SeqStack(PSeqStack S, int x);
int Pop_SeqStack(PSeqStack S, int * x);
int GetTop_SeqStack(PSeqStack S, int * x);
void Destroy_SeqStack(PSeqStack *S);
void Judge(PSeqStack S);
void InputX();
void InputR();
void DisplayStack(PSeqStack S);//定义
int main()
{
//float X;
//int R;
InputX();
InputR();
NumConvert(X, R);
system("pause");
return 0;
}
/***************************函数*******************************/
void NumConvert(int X, int R)//X为十进制整数 R是要转换成的进制
{
int Nega_X, t;//x可能为负数,需要转换成正数
PSeqStack S;
S = (PSeqStack)malloc(sizeof(SeqStack));
//SeqStack &S;
Init_SeqStack(S);
if (R <= 10)
{
if (X < 0)
{
Nega_X = -X;
while (Nega_X != 0)
{
t = Nega_X%R;
Push_SeqStack(S, t);
Nega_X = Nega_X / R;
}
Push_SeqStack(S, 1);//-数符号位为1
}
else if (X >= 0)
{
while (X != 0)
{
t = X%R;
Push_SeqStack(S, t);
X = X / R;
}
Push_SeqStack(S, 0);
}
DisplayStack(S);
Destroy_SeqStack(&S);
}
else if (R = 16)
{
if (X < 0)
{
Nega_X = X;
while (Nega_X)
{
t = Nega_X%R;
Push_SeqStack(S, t);
Nega_X = Nega_X / R;
}
Push_SeqStack(S, 1);
}
else if (X >= 0)
{
while (X)
{
t = X%R;
Push_SeqStack(S, t);
X = X / R;
}
Push_SeqStack(S, 0);
}
Judge(S);
Destroy_SeqStack(&S);
}
//else {
// printf("请输入正确的进制数!!\n");
// InputR();
//}
}
//初始化栈
#pragma region 初始化
PSeqStack Init_SeqStack(PSeqStack S)
{
//PSeqStack S;//指向顺序栈的指针
if (S) {
S->top = NULL;
}
return S;
}
#pragma endregion
//判空
int Empty_SeqStack(PSeqStack S)
{
if (-1 == S->top) {
return 1;
}
else {
return 0;
}
}
//入栈
int Push_SeqStack(PSeqStack S, int x)
{
if (S->top == MAXSIZE - 1)
return 0;
else
{
S->top++;
S->data[S->top] = x;
return 1;
}
}
//出栈
int Pop_SeqStack(PSeqStack S, int * x)
{/*删除栈顶元素并保存在*x */
if (Empty_SeqStack(S))
{
return 0;
}
else
{
*x = S->data[S->top];
S->top--;
return 1;
}
}
//取栈顶元素
int GetTop_SeqStack(PSeqStack S, int * x)
{
if (Empty_SeqStack(S))//!=0 即为空
{
return 0;
}
else {
*x = S->data[S->top];
return 1;
}
}
//销毁栈
void Destroy_SeqStack(PSeqStack *S)
{
if (*S)
free(*S);
*S = NULL;
return;
}
//判断16进制
void Judge(PSeqStack S)
{
int i;
printf("输出为(左边第一位为符号位)\n");
for (i = S->top; i > 0; i--)
{
switch (S->data[i])
{
case 10:printf("A");
break;
case 11:printf("B");
break;
case 12:printf("C");
break;
case 13:printf("D");
break;
case 14:printf("E");
break;
case 15:printf("F");
break;
default:printf("%d", S->data[i]);
break;
}
}
}
//输入
void InputX()
{
printf("请输入一个十进制整数:\n");
scanf("%f", &X);
while (X != (int)X)
{
printf("你输入的不是整数!!\n");
InputX();
}
//X = (int)X;
}
void InputR()
{
printf("\n请输入希望转成的进制数:\n");
scanf("%d", &R);
while (R > 10 && R>16)
{
printf("关于大于10的进制中只支持小于等于16进制!请重新输入:\n");
scanf("%d", &R);
}
}
//输出
void DisplayStack(PSeqStack S)
{
int i;
printf("%d 进制输出为(左边第一位为符号位,0为正):\n",R);
for (i = S->top; i > 0; i--)
{
printf("%d", S->data[i]);
}
}
转载于:https://my.oschina.net/ZhouHZ/blog/667700