欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

进制转换

程序员文章站 2024-02-05 12:43:10
...

题目描述:

 求任意两个不同进制非负整数的转换(二进制~十六进制),所给整数在long所能表达的范围之内。不同进制的表示符号为(0,1,...9,a,b,...,f),或者(0,1,...,9,A,B,...,F)。

输入:

 输入只有一行,包含三个整数a,n,b。a表示其后的n是a进制整数,b表示将a进制整数n转换成b进制的整数。a,b均是十进制整数,2<=a,b<=16.

输出:

 可能有多组测试数据,对于每组数据,输出包含一行,该行有一个整数,为转换后的b进制数,输出是字母符号全用大写字母表示,即(0,1,...,9,A,B,...,F)

样例输入:

 15 Aab3 7

样例输出:

 210306

 题目要求将a进制数转换成对应的b进制数,可以先将a进制数转换为我们较为熟悉的10进制,然后将十进制转换为b进制数

 先贴一个将二进制数转换为十进制的小函数,如下:

int BinaryToDecimal(char InputStr[],int m)
{
	int output_num = 0;										//存放十进制输出结果
	int length = strlen(InputStr);

	for (int i = 0; i < length; i++)
	{
		output_num = output_num * 2 + (InputStr[i]-'0');
	}
	return output_num;
}
 本题输入字符串不只有0,1二进制位,还有大小写字母,函数稍作改变,如下:
int OtherToDecimal(char InputStr[],int m)					//m进制数转换为十进制数的函数		
{
	int output_num = 0;										//存放十进制输出结果
	int length = strlen(InputStr);
	char tmp;
	for (int i = 0; i < length; i++)
	{
		tmp = InputStr[i];
		if (tmp >= '0'&& tmp <='9')							//当前字符为“数字”
		{
			output_num = output_num*m + (tmp-'0');
		}
		else if (tmp>='A'&&tmp <='Z')						//当前字符为“大写字母”
		{
			output_num = output_num*m+ (tmp-'A'+10);
		}
		else												//当前为“小写字母”
			output_num = output_num*m+ (tmp-'a'+10);
	}
	return output_num;
}
 下面是将十进制数转换成其他进制的函数:
void DecimalToOther(int inputnum,int m)						
{//将十进制数转换为m进制数的函数
	char buf[50],size = 0;
	int x;
	/*以下为关键代码*/
	do														//十进制转换为m进制
	{
		x =inputnum%m;
		buf[size++]=(x<10)?x+'0':x-10+'A';					//buf[size]中存a转换为m进制后的最低位
		inputnum/=m;										//a的高位整体向后移动一位
	} while (inputnum!=0);									//当a不为零时重复
	/*关键代码结束*/

	printf("转换为%d进制:",m);
	for (int i =size-1; i >= 0; i--)						//将结果输出,顺序应从高位到低位
		printf("%c",buf[i]);
	printf("\n");											//换行

}

在主函数中完成输入与调用,在主函数之前还要引入stdio和string两个头文件及标准命名空间:

int main()
{
	int a,b;
	char inputstr[50];
	int tmp_decimal;

	while (scanf("%d%s%d",&a,inputstr,&b)!=EOF)
	{
		tmp_decimal = OtherToDecimal(inputstr,a);
		DecimalToOther(tmp_decimal,b);
	}

	return 0;
}
黑框输出运行结果:

进制转换