数制转换参考代码 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));

}

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
网易公司版权所有 ©1997-2009