1.给一个M进制的数x,实现对x向任意的一个非M进制的数的转换;
2.基本概念:
基数:用一组固定的数字来表示数的大小,这组固定的数字的个数就称为该计数制的基数;
eg:十进制的基数是10;二进制的基数是2;
权:每一个数位都有一个固定的基值与之对应,称为权;对于一个M进制的数来说,小数点左边各位上对应的权值从右到左分别为基数的0次方,基数的1次方,对于小数点右边各位上对应的权值从左到右分别为基数的-1 次方,基数的-2次方
二进制,八进制,十六进制向十进制转换:按权展开相加;
十进制转换成二进制,八进制,十六进制:整数部分除以基数取余数(取余的方向为从后向前);小数部分乘以基数取余数(取整的方向为从前向后)
二进制,八进制,十六进制相互转换:先转换成十进制再转换成其他进制;或者按照其对应关系进行转换;
程序如下:
#include <stdio.h>
#define MAXCHAR 101
int char_to_num(char ch);
char num_to_char(int num);
long source_to_decimal(char temp[],int source);
int decimal_to_object(char temp[],long decimal_num,intobject);
void output(char temp[],int length);
main ()
{
intsource,object,length;
long decimal_num;
char temp[MAXCHAR];
int flag=1;
while(flag)
{
printf("before convert number:");
scanf("%s",temp);
printf("shuzhi:");
scanf("%d",&source);
printf("convert shuzhi:");
scanf("%d",&object);
printf("output number:");
decimal_num=source_to_decimal(temp,source);
length=decimal_to_object(temp,decimal_num,object);
printf("%d\n",length);
output(temp,length);
printf("continue:1 ",length);
scanf("%d",&flag);
}
}
int char_to_num(char ch)
{
if(ch>'0'&&ch<='9')
{
return ch-'0';
}
else
return ch-'A'+10;
}
char num_to_char(int num)
{
if(num>=0&&num<=9)
return(char)('0'+num-0);
else
return(char)('A'+num-10);
}
long source_to_decimal(char temp[],int source)
{
long decimal_num=0;
int length,i;
for(i=0;temp[i]!='\0';i++)
length=i;
for(i=0;i<=length-1;i++)
decimal_num=(decimal_num*source)+char_to_num(temp[i]);
return decimal_num;
}
int decimal_to_object(char temp[],long decimal_num,intobject)
{
int i=0;
while(decimal_num)
{
temp[i]=num_to_char(decimal_num%object);
decimal_num=decimal_num/object;
i++;
}
temp[i]='\0';
return i;
}
void output(char temp[],int length)
{
int i;
for(i=length-1;i>=0;i--)
printf("%c",temp[i]);
printf("\n");
}