[牛客网]任意进制转化

题目:给定一个十进制数M,以及需要转换的进制数N。将十进制数M转化为N进制数。

输入描述:
输入为一行,M(32位整数)、N(2 ≤ N ≤ 16),以空格隔开。
输出描述:
为每个测试实例输出转换后的数,每个输出占一行。如果N大于9,则对应的数字规则参考16进制(比如,10
用A表示,等等)
示例1:
输入
7 2
输出
111

首先要知道如何进制转换, 你可以在纸上练习一下10(D)转成2进制, 感受一下, 可以发现每一步都会得到一个结果, 最后将结果逆序, 基于这个思想我们可以有一下步骤:

  1. 输入十进制数及进制数
  2. 完成N进制下的逆序遍历, 这样比较容易并且更加贴近实际
  3. 将结果逆序
  4. 打印结果

注意: 这里的数可能会是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进制时的影响.
但是其中的思想才是精髓

完成sn进制下的数位遍历

https://blog.csdn.net/new_bee_01/article/details/89678709

发布了53 篇原创文章 · 获赞 46 · 访问量 7223

猜你喜欢

转载自blog.csdn.net/new_bee_01/article/details/102981506