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