#define MAXLEN 100
unsigned int check(char *s,unsigned int m);
void strtonum(char* str,unsigned int *p,unsigned int m);
unsigned long mto10(int *p,unsigned int mlen,unsigned int m);
void tenton(unsigned long l10,int *p,int n,unsigned int nlen);
void main()
{
unsigned int m,n,mlen,nlen;
char snumber[MAXLEN];
unsigned int* p;
unsigned long l10;/*l10为m进制转为n进制时作为中转的十进制数*/
int i;
printf("万能进制转换程序。请输入欲转换的数:/n");
gets(snumber);/*将输入的m进制数作为一个字符串接收*/
printf("m进制转为n进制,请输入m和n:/n");
printf("m=");scanf("%u",&m);
printf("n=");scanf("%u",&n);
if(m<2||n<2){printf("非法输入!");exit(0);}
mlen=check(snumber,m);
p=malloc(sizeof(int)*mlen);
strtonum(snumber,p,m);
l10=mto10(p,mlen,m);
free(p);
nlen=log(l10)/log(n);/*求出将十进制数l10转为n进制数时该n进制数的位数*/
p=malloc(sizeof(int)*nlen);
tenton(l10,p,n,nlen);
printf("转为:");
for(i=0;i<=nlen;i++)
{
if(n>36) printf("%u ",p[i]);
else
{
if(p[i]>=10)printf("%c",p[i]+A-10);
else printf("%d",p[i]);
}
}
printf("/n");
free(p);
}
unsigned int check(char *s,unsigned int m)
/*将输入的m进制数字符串全部转为大写并返回有效的m进制数的位数*/
{
unsigned int i=0,num=0;
strupr(s);
while(s[i]!=/0)
if(s[i++]== )
num++;
if(m>36)
{
return num+1;
}
else
{
return strlen(s)-num;
}
}
void strtonum(char* str,unsigned int *p,unsigned int m)
/*将输入的m进制数字符串一位一位转为数字并放入数组p中*/
{
int i=0,j=0;
char *q;
if(m>36)
{
q=strtok(str," ");p[i++]=atoi(q);
while(q){q=strtok(NULL," ");p[i++]=atoi(q);}
}
else
{
while(str[i]!=/0)
{
if(isalpha(str[i]))p[j++]=str[i]-A+10;
else if(isdigit(str[i]))p[j++]=str[i]-0;
i++;
}
}
}
unsigned long mto10(int *p,unsigned int mlen,unsigned int m)
/*将数组p中按位存放的m进制数转为十进制数并返回*/
{
unsigned long l=0,h;
int i,j;
for(i=mlen-1;i>=0;i--)
{
h=1;
for(j=1;j<=i;j++)h*=m;
l+=p[mlen-1-i]*h;
}
return l;
}
void tenton(unsigned long l10,int *p,int n,unsigned int nlen)
/*十进制转为n进制*/
{
unsigned long a=l10;
while(a)
{
p[nlen--]=a%n;
a/=n;
}
}