[牛客习题]任意进制转换
16lz
2021-02-03
题目描述
给定一个十进制数M,以及需要转换的进制数N。将十进制数M转化为N进制数
输入描述:
输入为一行,M(32位整数)、N(2 ≤ N ≤ 16),以空格隔开。
输出描述:
为每个测试实例输出转换后的数,每个输出占一行。如果N大于9,则对应的数字规则参考16进制(比如,10用A表示,等等)
示例1输入: 7 2
输出: 111
题目分析:
- 本题是要进行进制转换,根据输入进制数将M (十进制数) 转换为N进制。这里要注意负数的特殊处理。这里要特别注意,给的输入用例中没有说明负数的输出方式,如果是平时刷题,可能平台还会给出未通过的测试用例,我们看完之后把代码一修改就好了,但是笔试的时候未通过的测试用例不会给出,这就需要大家去猜测了,很磨人啊,所以各位还是要多刷题啊,才能见多识广~~~
- 这里参考其他解题思路,采用一个string table来进行进制数输出映射,按照字符串处理进行输出比较方便。首先一进来我们要先判断正负数。如果是负数就把他转换为正数处理标志flag更改为true;否则flag = false,表明它是正数。(这里我是先不知道负数如何处理的,考虑负数是补码存储比较复杂,先按正数跑完代码未通过的测试用例就告诉了负数的处理方式(输入4 3, 输出-11),从而可见他是直接先按正数处理,如果是负数就在前面添加‘-’就好好了)
- 标识完正负数后,m%n和table之间进行映射,将结果放到字符串res中(res += table[m%n]);最后m进行更新(m /= n)。当m不为0时循环继续。
- 最后根据flag值看是否需要加‘-’,由于我们计算数据时是从低位开始计算的,res中保存的的结果是逆序的,故我们翻转整个字符串res就得到最终结果了。
代码如下:
#include <iostream>#include <string>#include <algorithm>using namespace std;int main(){ string table = "0123456789ABCDEF", res; int m, n; cin >> m >> n; //标记负数,将负数转换为正数统一处理,最后根据标记输出负数时加上‘-’号 bool flag = false; if(m < 0) { flag = true; m = 0 - m; } while(m) { res += table[m%n]; m /= n; } if(flag) res += '-'; reverse(res.begin(), res.end()); cout << res << endl; return 0;}
©著作权归作者所有:来自51CTO博客作者星辰之洛的原创作品,如需转载,请注明出处,否则将追究法律责任
更多相关文章
- PHP类与对象的基础概念
- Python学习系列之 xrange和range的区别!
- PHP数组常用函数
- PHP字符串常用函数
- Linux系统性能监控工具Tsar
- PHP初级知识本地搭建和常用标签类型
- PHP运算符、分支及循环
- 跟自己的战斗
- php数据类型