链栈的应用:十进制有理数转化为r进制数

内容:将十进制有理数转换为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;
} 

运行结果:

链栈的应用:十进制有理数转化为r进制数 链栈的应用:十进制有理数转化为r进制数链栈的应用:十进制有理数转化为r进制数链栈的应用:十进制有理数转化为r进制数

 

 

 

 

上一篇:Cognos 11.2 单点登陆实现


下一篇:第九章 压缩和存储 【文件存储类型、压缩方式的选择】