[牛客习题]任意进制转换

题目描述ios

给定一个十进制数M,以及须要转换的进制数N。将十进制数M转化为N进制数ide

输入描述:测试

输入为一行,M(32位整数)、N(2 ≤ N ≤ 16),以空格隔开。spa

输出描述:code

为每一个测试实例输出转换后的数,每一个输出占一行。若是N大于9,则对应的数字规则参考16进制(好比,10用A表示,等等)
示例1ci

输入: 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就获得最终结果了。

代码以下:string

#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;
}
相关文章
相关标签/搜索