源代码:
#include <stdio.h>
#include <stdlib.h>
//程序目的:利用栈和队列进行进制转换
// 栈
typedef struct {
int data[20];
int top;
} Stack;
void Init(Stack *p) {
p->top = 0;
return;
}
int not_empty(Stack *p) {
return p->top;
}
int Push(Stack *p, int a) {
if (p->top == 10)
return 0;
else {
p->data[p->top] = a;
p->top++;
return 1;
}
}
int Pop(Stack *p, int *a) {
if (p->data == 0)
return 0;
else {
p->top--;
*a = p->data[p->top];
return 1;
}
}
int Top(Stack *p, int *a) {
if (p->data == 0)
return 0;
else {
*a = p->data[p->top-1];
return 1;
}
}
void Conversion1 (int N, int r) { //利用辗转相除法
Stack s;
int x;
Init(&s);
while (N) {
Push (&s, N%r);
N = N/r;
}
while (not_empty(&s)) {
Pop (&s, &x);
if (x>9)
printf("%c", x+55);
else
printf("%d", x);
}
}
//队列
typedef struct {
int data[20];
int front,rear;
} Queue;
void Init1 (Queue *p) {
p->front = p->rear = 0;
}
int Push1 (Queue *p, int a) {
if ((p->rear + 1) % 20 == p->front) {
printf("队满\n");
return 0;
}
else {
p->rear = (p->rear + 1) % 20;
p->data[p->rear] = a;
return 1;
}
}
int Pop1 (Queue *p, int *a) {
if (p->front == p->rear) {
printf("队空\n");
return 0;
}
else {
p->front = (p->front + 1) % 20;
*a = p->data[p->front];
return 1;
}
}
int not_empty1 (Queue *p) {
if (p->front == p->rear)
return 0;
else
return 1;
}
int is_full (Queue *p) {
if ((p->rear + 1) % 20 == p->front)
return 1;
else
return 0;
}
void Conversion2 (double a, int b) {
Queue s;
int x;
Init1(&s); //初始化队列
while (a>0.000000001) { //利用乘二取余法
a = a * b;
x = (int)a;
Push1 (&s, x); //入栈
a = a - x;
if (s.rear == 10)
break;
}
while (not_empty1(&s)) {
Pop1 (&s, &x); //出栈
if (x>9)
printf("%c", x+55);
else
printf("%d", x);
}
}
int main() {
int r,inter;
double N,dou;
while ((scanf("%lf%d", &N, &r)) == 2) {
inter = (int)N;
dou = N - inter;
if (inter == 0)
printf("0");
else
Conversion1 (inter, r);
if (dou<0.00000001)
printf("\n");
else {
printf(".");
Conversion2 (dou, r);
printf("\n");
}
}
return 0;
}
运行结果: