1. 程式人生 > >【資料結構】順序表實現十進位制轉換任意進位制

【資料結構】順序表實現十進位制轉換任意進位制

/*
& 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;
}