链栈实现辗转相除法转换十进制有理数

二.内容:将十进制有理数数转换为r进制数,其转换方法为辗转相除法。要求用链栈实现。

步骤:

  1. 算法设计
  1. Push()实现入栈;
  2. Empty()实现栈的空栈判断;
  3. Pop()实现出栈;
  4. Convert()实现数制转换;
  5. 设置变量int integer,int decimal存放有理数的整数和小数部分。
    /*日期:2021年10月16日
      问题描述:将十进制有理数数转换为r进制数,其转换方法为辗转相除法。要求用链栈实现。*/
      
    #include<stdio.h>
    #include<stdlib.h>
    typedef int datatype;
    typedef struct node{
    	datatype data;
    	struct node *next;			//声明链栈 
    }*linkstack;
     
    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;
    } 
    
    //入栈
    int Push(linkstack* top,datatype x) {						//插入数据元素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;					//定义 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");
    	 }
    } 
    
    

    运行结果:

     

     

  6. scanf()函数在处理输入的时候,除了%c模式(读取下一个字符),其他时候会跳过非空白字符前的所有空白字符,然后读取字符,直至遇到空白字符或者与正在读取字符不匹配的字符。scanf(“%d.%d”,&a,&b)读取给a的时候就读到小数点前,然后下一次读取小数点后的数字。

好的,我可以为您解答这个问题。为了把一个十进制转换成二进制数,您可以使用链栈结构来实现辗转相除法。下面是C语言代码示例: ```c #include <stdio.h> #include <stdlib.h> #define STACK_INIT_SIZE 20 #define STACKINCREMENT 10 typedef struct { int *base; // 栈底指针 int *top; // 栈顶指针 int stacksize; // 当前已分配的存储空间(以sizeof(int)为单位) } SqStack; // 初始化一个栈 void InitStack(SqStack *S) { S->base = (int *)malloc(STACK_INIT_SIZE * sizeof(int)); if (!S->base) { exit(1); // 存储分配失败 } S->top = S->base; S->stacksize = STACK_INIT_SIZE; } // 压栈 void Push(SqStack *S, int e) { // 栈满,追加存储空间 if (S->top - S->base >= S->stacksize) { S->base = (int *)realloc(S->base, (S->stacksize + STACKINCREMENT) * sizeof(int)); if (!S->base) { exit(1); // 存储分配失败 } S->top = S->base + S->stacksize; S->stacksize += STACKINCREMENT; } *(S->top) = e; // 入栈 S->top++; } // 出栈 int Pop(SqStack *S) { if (S->top == S->base) { exit(1); // 栈空 } S->top--; return *(S->top); // 出栈 } // 判断栈是否为空 int StackEmpty(SqStack S) { return S.top == S.base; } // 十进制转二进制 void DecimalToBinary(int n) { SqStack S; InitStack(&S); // 初始化栈 while (n) { Push(&S, n % 2); // 入栈余数 n /= 2; } while (!StackEmpty(S)) { printf("%d", Pop(&S)); // 出栈并输出 } } int main() { int n; printf("请输入一个十进制整数:"); scanf("%d", &n); printf("二进制数为:"); DecimalToBinary(n); return 0; } ``` 这段代码使用了链栈结构来实现十进制转二进制的功能。首先,初始化一个栈。然后,用辗转相除法十进制转换为二进制数,并入栈每个余数。最后,出栈并输出每个二进制位,即可得到十进制数的二进制形式。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值