数制转换

/*
题目:数制转换
内容:给定一个M进制的数x,实现对x向任意的一个非M进制的转换。
作答者:小白杨
收获: 1、刚开始以为这是一个失败的程序转换,不知为什么,数组没有传到被调用函数中,后来经反复折腾,才发现被调用函数中for语句括号后多加了一个‘;’,浪费了大量时间进行调试。
       2、这个代码着实垃圾,也不能实现负数的转换和小数点的转换,可优化的地方还有很多。
       3、解决字符串有效字符个数的常用方法:for(i=0;temp[i] != '\0';i++)。
       4、还有一种思路:将数制转换为十进制,以十进制为轴,进行转换。

*/

#include<stdio.h>
/*
volatile int N,n;
volatile int firstNumber[101],lastNumber[101];
//二进制转八进制
void two_to_eight(int firstNumber[])
{
	int i,j;

	int lastNumber[101] = {0};
	n = N/3+1;

	for(i=N-1,j=n-1;i>0&&j>=0;i-=3,j-=1)
	{
		lastNumber[j] = firstNumber[i]+firstNumber[i-1]*2+firstNumber[i-2]*4;
	}
	if(i == -1)
		lastNumber[0] = firstNumber[2] + firstNumber[1]*2 + firstNumber[0]*3;
	else if(i == -2)
		lastNumber[0] = firstNumber[1] + firstNumber[0]*2;
	else if(i == 0)
		lastNumber[0] = firstNumber[0];
	printf("转换后的数为:\n");
	for(i=0;i<n;i++)
		printf("%d",lastNumber[i]);
	printf("\n");
 }
//二进制转十进制
void two_to_ten(int firstNumber[])
{

}
//二进制转十六进制
void two_to_sixteen(int firstNumber[])
{

}
//八进制转二进制
void eight_to_two(int firstNumber[])
{

}
//八进制转十进制
void eight_to_ten(int firstNumber[])
{

}
//八进制转十六进制
void eight_to_sixteen(int firstNumber[])
{

}
//十进制转二进制
void ten_to_two(int firstNumber[])
{

}
//十进制转八进制
void ten_to_eight(int firstNumber[])
{

}
//十进制转十六进制
void ten_to_sixteen(int firstNumber[])
{

}
//十六进制转二进制
void sixteen_to_two(int firstNumber[])
{

}
//十六进制转八进制
void sixteen_to_eight(int firstNumber[])
{

}
//十六进制转十进制
void sixteen_to_ten(int firstNumber[])
{

}
int main()
{
	char flag;

	while(1)
	{
		int firstBase,lastBase,i;

	//	firstNumber[101] = {0};
		printf("请输入被转换数的进制:\n");
		scanf("%d",&firstBase);
		getchar();
		printf("请输入要转换数的位数:\n");
		scanf("%d",&N);
		getchar();
		printf("请输入要转换的数:\n");
		for(i=0;i<N;i++)
		{
			scanf("%d",&firstNumber[i]);
		}
		for(i=0;i<N;i++)
		{
			printf("%d",firstNumber[i]);
		}
		getchar();
		printf("请输入要转换成的进制:\n");
		scanf("%d",&lastBase);
		getchar();
		switch(firstBase)
		{
			case 2:
				{
					switch(lastBase)
					{
						case 8: two_to_eight(firstNumber);break;
						case 10:two_to_ten(firstNumber);break;
						case 16:two_to_sixteen(firstNumber);break;
						default:
							printf("没有这种进制!\n");
							break;
					}
					break;
				}
			case 8:
				{
					switch(lastBase)
					{
						case 8: eight_to_two(firstNumber);break;
						case 10:eight_to_ten(firstNumber);break;
						case 16:eight_to_sixteen(firstNumber);break;
						default:
							printf("没有这种进制!\n");
							break;
					}
					break;
				}
			case 10:
				{
					switch(lastBase)
					{
						case 2: ten_to_two(firstNumber);break;
						case 8:ten_to_eight(firstNumber);break;
						case 16:ten_to_sixteen(firstNumber);break;
						default:
							printf("没有这种进制!\n");
							break;
					}
					break;
				}
			case 16:
				{
					switch(lastBase)
					{
						case 2: sixteen_to_two(firstNumber);break;
						case 8:sixteen_to_eight(firstNumber);break;
						case 10:sixteen_to_ten(firstNumber);break;
						default:
							printf("没有这种进制!\n");
							break;
					}
					break;
				}
			default:
				printf("没有这种进制\n");
				break;
		}
		printf("是否继续转换:Y|N\n");
		scanf("%c",&flag);
		if('N' == flag)
			break;
	}

	return 0;
}
*/
#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);  //将原数转换为十进制的数
int decimal_to_object(char temp[],long decimal_num,int object);
//将十进制数转换为目标数制并存于字符串中
void output(char temp[],int length); //逆序打印字符数组

main() {
	int source;   //原数制
	int object;   // 目标数制
	int length;   //转换后目标数制字符数组的长度
	long decimal_num;  //作为轴十进制
	char temp[MAXCHAR]; //存储待转换的数值和转换后的数值
	char flag;

	while(1) {
		printf("转换前的数为:");
		scanf("%s",temp);
		printf("转换前的数制是:");
		scanf("%d",&source);
		printf("转换后的数制是:");
		scanf("%d",&object);
		printf("转换后的数为:");
		decimal_num = source_to_decimal(temp,source);
		length = decimal_to_object(temp,decimal_num,object);
		output(temp,length);
		printf("是否继续转换:Y||N");
		scanf("%c",&flag);
		printf("%c\n",flag);
		if(flag == 'N')
			break;
	}
}
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;
	int i;
	for(i=0; temp[i] != '\0'; i++);  //特别重要,求一个位置长度字符串的长度
	length = i;
	for(i=0; i<length; i++)/*元素temp[0]转换成相应的数值后与变量decimal_num的初值相加(为不影响
	最后的结果,decimal_num的初值应为0),把得到的和再次赋给decimal_num;decimal_num与第二个元
	素temp[1]相加之前应先乘一次基数source,相加之后得到的最新数据依然赋值给变量;以此类推,直
	到与最后一个有效元素相加,一共累加了有效长度N次,第一个元素与基数相乘N-1次,···最后一
	个元素与基数相乘0次*/
	{
		decimal_num = (decimal_num*source) + char_to_num(temp[i]);
	}

	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 length) {
	int i;
	for(i=length-1; i>=0; i--) {
		printf("%c",temp[i]);
	}
	printf("\n");
} //逆序打印字符数组























 

  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值