进制转换
DD5 进制转换 牛客
描述
给定一个十进制数M,以及需要转换的进制数N。将十进制数M转化为N进制数
输入描述:
输入为一行,M(32位整数)、N(2 ≤ N ≤ 16),以空格隔开。
输出描述:
为每个测试实例输出转换后的数,每个输出占一行。如果N大于9,则对应的数字规则参考16进制(比如,10用A表示,等等)
我的思路:
#include <iostream>
#include <cmath>
#include <string>
using namespace std;const string value = "0123456789ABCDEFG";int main()
{long long M, N;cin >> M >> N;string res;if(M == 0) res = "0";if(M < 0) res += "-";M = abs(M);int t = 0;while (pow(N, t) <= M){t++;}t--;//这就是在N进制下最高的位数for (int i = t; i >= 0; i--){int lo = M / (long long)pow(N, i);M -= lo * pow(N, i);res += value[lo];}cout << res << endl;
}
其他思路1
这个思路的本质就是:先求在个位(零次方位)的个数,再去掉个位(零次方位),十位(一次方位)就变成了新的个位,继续按照这个方法计算。
当时我陷入了误区,其实拿10进制对比一下就好了,比如:
195 / 10 = 19……5
19 / 10 = 1……9
1 / 10 = 0……1
如果没有余数,说明这个位置的数字就是0。比如在二进制下个位不可能是3,为什么,因为3一定会被分为2+1,2会去下一个进制位。
根据这样的算法思路可以写出更加优秀的代码:
#include <iostream>
#include <cmath>
#include <string>
#include <algorithm>
using namespace std;const string value = "0123456789ABCDEFG";int main()
{long long M, N;cin >> M >> N;string res;bool flag = false;if(M == 0) res = "0";else if(M < 0) flag = true;M = abs(M);while(M != 0){res += value[M%N];M /= N;}reverse(res.begin(),res.end());if(flag){res.insert(0, "-");}cout << res << endl;
}