题目:给定一个十进制数M,以及需要转换的进制数N。将十进制数M转化为N进制数。
输入描述:
输入为一行,M(32位整数)、N(2 ≤ N ≤ 16),以空格隔开。
输出描述:
为每个测试实例输出转换后的数,每个输出占一行。如果N大于9,则对应的数字规则参考16进制(比如,10
用A表示,等等)
示例1:
输入
7 2
输出
111
首先要知道如何进制转换, 你可以在纸上练习一下10(D)转成2进制, 感受一下, 可以发现每一步都会得到一个结果, 最后将结果逆序, 基于这个思想我们可以有一下步骤:
- 输入十进制数及进制数
- 完成N进制下的逆序遍历, 这样比较容易并且更加贴近实际
- 将结果逆序
- 打印结果
注意: 这里的数可能会是ABC…十六进制下的字母, 故保存时不能保存到整形变量中, 可以保存在string里, 但是要注意字符与整形之间的转换
下面献上代码:
#include <iostream>
#include <string>
#include <cstdlib>
using namespace std;
int main()
{
int n = 0;
int sn;
cin >> n >> sn;
string s;
// 设置一个标志, 入过输入的是一个负数, 那么先将负号去掉, 得到的最终结果前再加上负号即可
int flag = 0;
if (n == 0)
{
cout << 0 << endl;
return 0;
}
if (i < 0)
{
flag = 1;
i *= -1;
}
int i = n;
// 完成sn进制下的数位遍历, 可以发现是逆序的
// 这里看不懂可以参考作者的另一篇博客, 比克链接将在下方
for (; i; i /= sn)
{
if (i % sn > 9)
{
s.push_back('A' + i % sn - 10);
}
else
{
s.push_back('0' + i % sn);
}
}
for (size_t i = 0,j = s.size() - 1; i < s.size() / 2; ++i, --j)
{
swap(s[i], s[j]);
}
if (flag == 0)
cout << s << endl;
else
cout << "-" + s << endl;
system("pause");
return 0;
}
参考思想:
作者的另一篇博客, 此时我还没有考虑到16进制时的影响.
但是其中的思想才是精髓
https://blog.csdn.net/new_bee_01/article/details/89678709