进制转换
程序员文章站
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;
}
黑框输出运行结果: