进制转换

#include <stdio.h>
#include<string.h>
#define MAXCHAR 101       	  			/*最大允许字符串长度*/
int char_to_num(char ch);            			/*返回字符对应的数字*/
char num_to_char(int num);           			/*返回数字对应的字符*/
long source_to_decimal(char temp[],int source); 	/*返回由原数转换成的10进制数*/
int decimal_to_object(char temp[],long decimal_num,int object); /*返回转换成目标数制后字符数组的长度*/
void output(char temp[]); 				/*将字符数组逆序打印*/
int main()
{
	int source;   							/*存储原数制*/
  	int object;    							/*存储目标数制*/
  	long decimal_num;    					/*存储转换成的10进制数*/
  	char temp[MAXCHAR];  					/*存储待转换的数值和转换后的数值*/
  	int flag=1;    							/*存储是否退出程序的标志*/
	while(flag)   							/*利用输入的flag值控制循环是否结束*/
	{
		printf("转换前的数是:");
		scanf("%s",temp);
  	    printf("转换前的数制是:");
  	    scanf("%d",&source);
  	    printf("转换后的数制是:");
  	    scanf("%d",&object);
  	    printf("转换后的数是:");
		decimal_num=source_to_decimal(temp,source);         /*无论是谁,先转化为十进制*/
		decimal_to_object(temp,decimal_num,object);
		output(temp);
		printf("继续请输入1,否则输入0:\n");
		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);   			/*将0~9之间的数字转换成字符*/
	else
  	    return (char)('A'+num-10);   			/*将大于10的数字转换成字符*/
}
long source_to_decimal(char temp[],int source)
{
	long decimal_num=0;   					/*存储展开之后的和*/
	int length;
	int 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]);
    /*再下面这一个耗时就较长了,不过易懂,按权相加*/
    for(i = 0; i < length; i++)
    {
        int t = length - i - 1, dec = char_to_num(temp[i]);
        while(t--)
            dec = dec * source;
        decimal_num += dec;
    }
  	return decimal_num;
}
int decimal_to_object(char temp[],long decimal_num,int object)
{
	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 i = strlen(temp) ;
	while(i--)   					/*输出temp数组中的值*/
		printf("%c",temp[i]);

	printf("\n");
}

 

posted @ 2019-01-28 10:14  DIY-Z  阅读(164)  评论(0编辑  收藏  举报