M进制的数转换为N进制的数值

本文介绍了一个可以将任意进制数转换为另一任意进制数的程序,包括输入验证、转换逻辑及输出格式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


#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;

}

}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值