二.内容:将十进制有理数数转换为r进制数,其转换方法为辗转相除法。要求用链栈实现。
步骤:
- 算法设计
- Push()实现入栈;
- Empty()实现栈的空栈判断;
- Pop()实现出栈;
- Convert()实现数制转换;
- 设置变量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"); } }
运行结果:
-
scanf()函数在处理输入的时候,除了%c模式(读取下一个字符),其他时候会跳过非空白字符前的所有空白字符,然后读取字符,直至遇到空白字符或者与正在读取字符不匹配的字符。scanf(“%d.%d”,&a,&b)读取给a的时候就读到小数点前,然后下一次读取小数点后的数字。