任意进制转换
代码如下:
#include<stdio.h>
#include<math.h>
#include<string.h>
#include<stdbool.h>
#define M 16
char a[M] , x[100] , y [100] , nua[100] , nub[100];
int n1 , n2 , f=0;
double s=0 ;
void build (void)
{
int i;char q;
for(i=0 , q='0';i<10;i++ , q++)
a[i]=q;
for(i=10 , q='A';i<M;i++ , q++)
a[i]=q;
}
bool check ()
{
int i , j , k=0 , n=0;
for(i = 0 ; i<strlen(x) ; i++)
{
if(x[i]=='.') k++;
for( j=0 ;j<n1; j++){
if(x[i]==a[j]) k++;
}
}
if(k!=strlen(x))return false;
return true;
}
void change10 (void)
{
int i , j , k=0 , m , n=0 ;
while(x[k]!='.'&&x[k]!='\0')
{
k++;
}
//printf("%c\n",x[k]);
if(x[k]=='\0')
{
for(i=k-1,j=0;i>=0;i--,j++)
{
for(int w=0; w<n1 ;w++)
if(x[i]==a[w]) m=w;
f =f + m*pow(n1,j);
}
}
if(x[k]=='.')
{
for(i=k-1,j=0;i>=0;i--,j++)
{
for(int w=0; w<n1 ;w++)
if(x[i]==a[w]) m=w;
f = f + m*pow(n1,j);
}
for(i=k+1 , j=-1;i<strlen(x);i++,j--)
{
for(int w=0; w<n1 ;w++)
if(x[i]==a[w]) m=w;
s = s + (double)(m*pow(n1,j));
}
}
}
void change (void)
{
int i=0 , j=0 , k;
while (f != 0)
{
for(int w=0;w<n2;w++)
{
if(w==f%n2)
nua[i]=a[w];
}
f = f / n2;
i++;
}
while (s != 0)
{
k=(int)(s*n2);
for(int w=0;w<n2;w++)
{
if(w==k)
nub[j] = a[w];
}
s = s*n2-k;
j++;
}
}
void putout (void)
{
int i;
for(i=strlen(nua)-1;i>=0;i--)
printf ("%c" , nua[i]);
if(nub[0]!='\0')
{
printf(".");
puts (nub);
}
}
int main () {
int i , j , k ;
double n;
char q ;
printf("请输入需要转换的进制和目标进制(用一个西文空格隔开)\n");
scanf("%d%d" , &n1 ,&n2);
if ( n1 > M || n2 > M)
printf("ERROR");
else
{
build();
printf("请输入需要转换的数字:");
getchar();
gets( x );
if(check()==false)
printf("ERROR");
else
{
change10();
//n=(double)f;
//printf("%.3lf\n",f+s);
change();
putout();
return 0;
}//小else
}//大else
}
EG:(字母要大写)