【刷题点滴】进制转换

进制转换

DD5 进制转换 牛客

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

猜你喜欢

转载自blog.csdn.net/m0_73209194/article/details/131701294