内容:将十进制有理数转换为r进制数,其转换方法为辗转相除法。要求用链栈实现 。
算法分析:
对于整数的处理与上一题相同,主函数有两个输入,即输入待转化的数和要转化的进制,Convert函数思想:先判断待转化数的正负,用if...else语句分别实现正数和负数的转化,利用取余和取整操作,再借助于栈的操作进行辗转相除来实现。
不同的是,有理数需要考虑小数部分的处理,小数部分也可以看做一个整数来处理,只需要在输出的时候在前面添加小数点
概要设计:
Push()函数 |
实现入栈操作 |
Pop()函数 |
实现出栈操作 |
Empty()函数 |
空栈判断 |
Convert()函数 |
实现进制转换操作 |
代码:
#include<stdio.h>
#include<stdlib.h>
typedef int datatype;
typedef struct node{
datatype data;
struct node *next; //声明链栈
}*linkstack;
//入栈
int Push(linkstack* top,datatype x)
{
linkstack s=(linkstack)malloc(sizeof(struct node)); //申请内存
if(s == NULL)
return 0;
s->data=x;
s->next=(*top); //s 成为栈顶
(*top)=s;
return 1;
}
//判空
int Empty(linkstack top){
if(top == NULL)
return 1;
return 0;
}
//出栈,逐个输出余数
int Pop(linkstack* top,datatype* x){
if(top != NULL){ //如果栈没空,就输出一个余数,直到空栈
linkstack p=(*top);
(*x)=(*top)->data;
(*top)=(*top)->next;
free(p);
return 1;
}
return 0;
}
//转换,将十进制有理数数转换为任意进制有理数
void Convert(int integer,int decimal,int mode)
{
int h;
linkstack top = NULL;
printf("转换结果为: ");
if(integer>0)
{
while(integer != 0)
{ //处理整数部分
h=integer%mode; //求模得到余数 h
Push(&top,h); //辗转相除,把余数压入栈
integer=integer/mode;
}
while(!Empty(top))
{ //如果不是空栈,出栈
Pop(&top,&h);
printf("%d",h);
}
if(decimal != 0)
{ //若小数部分不为零,处理小数部分
printf("."); //先输出一个小数点,再通过辗转相除法将余数出栈入栈
while(decimal != 0)
{
h=decimal%mode;
Push(&top,h);
decimal=decimal/mode;
}
while(!Empty(top))
{
Pop(&top,&h);
printf("%d",h);
}
}
else
printf("\n");
}
else if(integer<0)
{ //如果有理数是负数,获取到的有理数整数部分integer就是负数
printf("-"); //将其取正数,输出时在它前面输出一个负号
integer=integer*(-1);
while(integer != 0)
{
h=integer%mode;
Push(&top,h);
integer=integer/mode;
}
while(!Empty(top))
{
Pop(&top,&h);
printf("%d",h);
}
if(decimal != 0)
{
while(decimal != 0)
{
h=decimal%mode;
Push(&top,h);
decimal=decimal/mode;
}
printf(".");
while(!Empty(top))
{
Pop(&top,&h);
printf("%d",h);
}
}
else
printf("\n");
}
else if(integer == 0)
{
if(decimal != 0)
{
while(decimal != 0)
{
h=decimal%mode;
Push(&top,h);
decimal=decimal/mode;
}
printf("0.");
while(!Empty(top))
{
Pop(&top,&h);
printf("%d",h);
}
}
else
printf("0\n");
}
}
int Push(linkstack* top,datatype x);
int Empty(linkstack top);
int Pop(linkstack* top,datatype* x);
void Convert(int integer,int decimal,int mode);
int main(void)
{
int integer,mode,decimal; //定义整型变量有理数的整数部分 integer还有有理数的小数部分 decimal和转换的进制 mode
printf("\n请输入要转换的数: ");
scanf("%d.%d",&integer,&decimal);
printf("\n请输入要转换的进制:");
scanf("%d",&mode);
Convert(integer,decimal,mode);
return 0;
}
运行结果: