任意进制
10进制 VS 2进制
https://www.nowcoder.com/practice/fd972d5d5cf04dd4bb4e5f027d4fc11e
简单思路
运用除法与取模实现进制转换。
PS:若涉及大于10进制的转换时,可以使用map存储数字对应的字母表示。(此处尚未考虑,思路是一样的)
(一) string divide(string num, int m, int n, char& ch):
负责将m进制的num转化成n进制过程中使用的除法操作。
- 函数作用:返回 (
(m进制的num)/n) 的结果,即商。 ch传递(m进制的num)%n的结果,即余数。 - m --- num的进制
- n --- num要转换成的进制
- ch --- num%n的余数
关键点:
remain记录当前余数- 更新
num[i] - 返回值删除前置0
代码:
string divide(string num, int m, int n, char& ch) {
// string res = "";
int len = num.length();
int remain = 0;
for(int i = 0; i<len; i++) {
int t = remain*m+num[i]-'0';
num[i] = t/n+'0';
remain = t%n;
}
int i = 0;
while (num[i]=='0') {
i++;
}
ch = char(remain+'0');
return num.substr(i);
}
(二)string change(string num, int from, int to):
思路:
- 每次都用 from进制 的 num 除以 to,返回值更新 num;
- 直到 num为空 时,停止循环。
- 关于为什么为空而不是'0'? 因为divide返回的结果会删除前置0,当除以结果为'0'时删除前置0剩下空字串。
负责实现from到to的进制转换。
- from:num的进制。
- to:num要转换成的进制。
关键点:
- 每次都要更新 num 的值。
- 更新res:先生成低位。
代码:
string change(string s, int from, int to) { // 转为2进制
string res = "";
while(s.size()!=0) {
char bit;
// int bit = (s.back()-'0') % to;
// res = char(bit+'0') + res;
s = divide(s, from, to, bit);
res = char(bit) + res;
}
return res;
}
完整代码
#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
string divide(string num, int m, int n, char& ch) {
// string res = "";
int len = num.length();
int remain = 0;
for(int i = 0; i<len; i++) {
int t = remain*m+num[i]-'0';
num[i] = t/n+'0';
remain = t%n;
}
int i = 0;
while (num[i]=='0') {
i++;
}
ch = char(remain+'0');
return num.substr(i);
}
string change(string s, int from, int to) { // 转为2进制
string res = "";
while(s.size()!=0) {
char bit;
// int bit = (s.back()-'0') % to;
// res = char(bit+'0') + res;
s = divide(s, from, to, bit);
res = char(bit) + res;
}
return res;
}
/*
string multiple(string num, int n) { // n进制转10进制
string res = "";
int carry =0;
for(int i = num.length()-1; i>=0; i--) {
int t = (num[i]-'0') * n + carry;
res = char(t%10+'0') + res;
carry = t/10;
}
if(carry!=0) {
res = char(carry+'0') + res;
}
return res;
}
string add(string num, int n) {
string res = "";
int carry = 0;
for(int i = num.length()-1; i>=0; i--) {
int sum = num[i]-'0'+carry;
res = char(sum%10+'0') + res;
carry = sum/10;
}
if(carry!=0) res = char(carry+'0') +res;
return res;
}
*/
int main() {
string num;
while (cin >> num) { // 注意 while 处理多个 case
string s = change(num, 10, 2);
reverse(s.begin(), s.end());
s = change(s, 2, 10);
cout << s << endl;
}
}
// 64 位输出请用 printf("%lld")


