数制转换参考代码 2007-02-13 23:56
#include<stdio.h>
#include<math.h>
struct stack {
int data[100];
int n;
};
void INIT(stack &s) {
s.n = 0;
}
void PUSH(stack &s, int e) {
s.data[s.n++] = e;
}
POP(stack &s) {
return s.data[--s.n];
}
void f1(int m, int n) {
stack s;
INIT(s);
int e;
while(m) {
PUSH(s, m%n);
m /= n;
}
while(s.n) {
e = POP(s);
if(n<10) printf("%d", e);
else e>=10? printf("%c", char(e-10+'A')) : printf("%d", e);
}
}
void f2(double m, int n) {
while(m) { if(n<10) printf("%d", int(m*n));
else m*n>=10? printf("%c", char(int(m*n)-10+'A')) : printf("%d", int(m*n));
m = m*n - int(m*n);
}
}
void f(double m, int n) {
f1(int(m), n);
if(int(m) == m) return;
putchar('.');
m -= int(m);
f2(m, n);
}
void f10(char c[], double m) {
printf(" %s 转换成 2进制 = ", c); f(m, 2); putchar('\n');
printf(" %s 转换成 8进制 = ", c); f(m, 8); putchar('\n');
printf(" %s 转换成16进制 = ", c); f(m,16); putchar('\n');
}
double fn_10(char c[], int n) {
char z[100];
int i = 0, j;
double b = 0;
printf(" %s 转换成10进制 = ", c);
while(*c != '.' && *c != '\0') z[i++] = *c++;
i--;
if(*c == '\0') c--;
for(j = 0; j <= i; j++)
if(z[j] < 65) b += (z[j]-48) * pow(n,i-j);
else b += (z[j]-55) * pow(n,i-j);
for(c++, j = -1; *c != '\0' ; c++, j--)
if(*c < 65) b += (*c-48) * pow(n,j);
else b += (*c-55) * pow(n,j);
printf("%g\n", b);
return b;
}
void main() {
puts(" 进制转换");
char c[100];
int n;
printf("\n 输入一数与它的进制: ");
scanf("%s%d", c, &n);
putchar('\n');
f10(c, fn_10(c,n));
}