【数据结构】顺序表实现十进制转换任意进制
/*
& 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;
}