进制转换
我们通过例题来了解进制的转换
例题
题目描述: 求任意两个不同进制非负整数的转换(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)。
输入 15 Aab3 7
输出 210306
思路
是先将任意进制数转换为十进制数(乘),再由十进制数转换为任意进制数(除),不要忘记输出是A~F的特别处理。
代码
#include<iostream> #include<string> #include<cstring> #include<cmath> using namespace std; int main() { int m, n; string c; long long num=0; cin >> m >> c >> n; for (int i = 0; i < c.length(); i++) { if (islower(c[i])) num += (c[i] - 'a' + 10) * pow(m, c.length() - 1 - i); //如果是字母的话就+10,因为a代表10 else if (isupper(c[i])) num += (c[i] - 'A' + 10)*pow(m, c.length() - 1 - i); else if (isdigit(c[i]))num += (c[i] - '0')*pow(m, c.length() - 1 - i);//如果是数字就直接乘 } int out[100]; int s = 0; while (num > 0) { out[s++] = num%n; num /= n; } if (n <= 9)//将变为的进制<=9 { for (int i = s - 1; i >= 0; i--) cout << out[i]; } else { for (int i = s - 1; i >= 0; i--) { if (out[i] >= 10)cout << (out[i] - 10 + 'A'); else cout << out[i]; } } }
例题二
https://www.luogu.com.cn/problem/P1017(负数的进制转换)
题目分析
如果余数为负数,余数减去进制数,商加1
代码
#include<iostream> using namespace std; int main() { int a, b; std::ios::sync_with_stdio(false); std::cin.tie(0); std::cout.tie(0); cin >> a >> b; char list[300]; int cnt = 0; int aa = a; while (a!=0) { int k = a%b; a = a / b; if (k < 0) { k -= b; a += 1; } if (k < 10)list[cnt++] = k + '0'; else list[cnt++] = k - 10 + 'A'; } cout << aa << "="; for (int i = cnt - 1; i >= 0; i--) cout << list[i]; cout << "(base" << b << ")"; }