【数据结构】顺序表实现十进制转换任意进制

/*
& File     : 进制准换 
* Author   : Laugh
* Copyright: Laugh
* 主题     :对于输入的任意一个非负十进制小数,打印输出与其等值的任意进制小数 
* Date     : 2018/10/14 
*/
#include <stdio.h>
#include <stdlib.h>
#include <math.h> 
#include <malloc.h> 
#define M 100

typedef char datatype;
typedef double datatype_d;

typedef struct seqstack {
    datatype data[M];
    char top; 
} seqstack;

/* 初始化顺序栈 */
void InitStack(seqstack *s) {   
    s->top = -1;
}

/* 判断栈是否为空 */ 
int StackEmpty(seqstack *s) {   
    if (s->top >= 0) return 1;
    else return 0;
}

/* 元素入栈函数 */
seqstack *push(seqstack *s, datatype x) {        
	if (s->top == M-1) return NULL;
 	else {  
		s->top++;
		s->data[s->top] = x;
	}
 	return s; 
}

/* 元素出栈函数 */
datatype pop(seqstack *s) {     
	datatype x;
	x = s->data[s->top]; 
	s->top--; 
	return x;
}

int main() {                      
	seqstack *s;
	datatype e, n_1, iBase;
	datatype_d n, d; 
	int i = 0, j = 0, temp;
	char flag;
	
	printf("请输入需要转换的十进制小数:"); 
 	scanf("%lf", &n);                             // 输入非负十进制小数 n
	printf("请输入需要转换的进制:");
	scanf("%d", &iBase);
	 
 	s = (struct seqstack*)malloc(sizeof(char));
 	if (s == NULL) exit(0); 
 	
 	/* 将 n 分成整数和小数两部分 */ 
	e = (int)n;
	d = n - e;
	n_1 = e;
	
	printf("十进制小数 %f 转换成 %d 进制数为:", n, iBase);

	if (n_1 == 0) {
		printf("%d", n_1);
	} else {
		InitStack(s);                             // 初始化栈
	 	if (n > 0) temp = n_1;
		else temp = -n_1;

		while(temp) {
			flag = temp % iBase + '0';
			if(flag > '9') flag = flag - '9' + 64;
			push(s, flag);
			temp /= iBase;
			i++;
		}
		
		/* 输出整数部分 */ 
 		if (n_1 < 0) printf("-");
 		while (j < i) {
 			j++;
 			e = pop(s);
 			printf("%c", e);
		}
	}
	
	/* 小数部分输出 */ 
	printf(".");
	for (int j = 0; j < 8; j++) {
		d *= iBase;
		flag = d + '0';
		if (flag > '9') flag = flag - '9' + 64;
		printf("%c", flag);
		if ((int)d) d -= (int)d;
	}
	//printf("0");
	
	return 0;
}

 

posted @ 2018-10-14 11:34  laugh12321  阅读(78)  评论(0编辑  收藏  举报