问题:给定一个M进制的数x,实现对x向任意一个非M进制的数转换。
分析:十进制转其他进制,整数部分除以基数取余数(取余数的方向从后往前),小数部分乘以基数取整数(取整方向从前往后);其他进制转十进制:按权展开相加;其他进制转其他进制:先转为十进制再转为其他进制。十六进制0到F,故是字符数组,因此我们需要定义一个char_to_number函数来使字符数组转换为数字,同时定义一个number_to_char函数来把数字转化成字符数组。字符转换成数字:字符-‘0’所得的ASCII值即为该数字,对于A到F则·需要让字符-‘A’+10即可。数字转换成字符:0到9可以使用强制类型转换,10以后的数字则是‘A’+num-10;
#include<stdio.h>
#define N 10
/*将字符转换成数字*/
int char_to_num(char ch)
{
if(ch>='0'&&ch<='9')
return ch-'0'; //字符小于10
else
return ch-'A'+10;//字符大于10
}
/*将数字转换为字符*/
char num_to_char(int num)
{
if(num>=0&&num<=9)
return (char) ('0'+num-0);//将0到9间的数字转换成字符
else
return (char)('A'+num-10);//将大于10的数字转换为字符
}
/*其他进制转十进制*/
long source_to_decimal(char temp[],int source)
{
long decimal=0;
int length;
int i;
for(i=0;temp[i]!='\0';i++)
{
length=i;}
for(i=0;i<=length;i++)
{
decimal=(decimal*source)+char_to_num(temp[i]);
}
return decimal;
}
int decimal_to_object(char temp[],long decimal,int object)
{
int i=0;
while(decimal)
{
temp[i]=num_to_char(decimal%object);//求出余数并转换成字符
decimal=decimal/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");
}
int main()
{
int source; //存储原数制
int object; //存储目标数制
int length; //存储转换成目标数制后字符数组的长度
long decimal; //存储转换成的十进制数
char temp[N];//存储待转换的数值和转换好的数值
int flag=1; //存储是否退出程序的标志
while(flag)
{
printf("转换前的数是");
scanf("%s",temp);
printf("转换前的数制是");
scanf("%d",&source);
printf("转换后的数制是");
scanf("%d",&object);
printf("转换后的数是");
decimal=source_to_decimal(temp,source);
length=decimal_to_object(temp,decimal,object);
output(temp,length);
printf("qingjixvshuru");
scanf("%d",&flag);
}
return 0;
}
标签:字符,转换,temp,int,decimal,char,num,数制 From: https://www.cnblogs.com/qian-heng/p/17348537.html