日常生活中人们使用的数字一般都是 十进制,而计算机使用的进制是二进制, 另外还有八进制、十六进制以及各种数字的进制,那么这就会产生一个问题:对两个不同进制,应该如何进行相互转换呢?
对一个P进制的数,如果要转换为Q进制,需要分为两步:
1、将P进制数x转换为十进制数y
2、将十进制数y转换为Q进制数z
int z[40], num = 0;
do {
z[num++] = y % Q;
y = y / Q;
} while(y != 0);
例题展示
题目描述
求任意两个不同进制非负整数的转换(2进制~16进制),所给整数在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)。
样例输入
4 123 10
样例输出
27
代码展示
#include<cstdio>
#include<cstring>
int toInt(char a)
{
if(a >= '0' && a <= '9') return a - '0';
else if(a >= 'a' && a <= 'f') return a - 'a' + 10; // 小写
else return a - 'A' + 10; // 大写
}
char toChar(int x)
{
if(x >= 0 && x <= 9) return '0' + x;
else return 'A' + x - 10;
}
int main()
{
int a, b; //a进制 b进制整数
char s[50];
while((scanf("%d%s%d", &a, s, &b) != EOF))
{
// 先转换为十进制
int y = 0; // y存十进制数
int product = 1; // product在循环中会不断乘P,得到1、P、P^2
for(int i = strlen(s) - 1; i >= 0; i--) {
y += toInt(s[i]) * product;
product = product * a;
}
//再转换为b进制
char ans[100], num = 0; // num为位数
do
{
ans[num++] = toChar(y % b);
y /= b;
}
while(y != 0);
for(int i = num - 1; i >= 0; i--)
{
printf("%c", ans[i]);
}
printf("\n");
}
}
小结
用字符串存储和表示不同进制的数(例如常用的十六进制数)。