进制转换
描述
给定一个十进制数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;
}