【基础算法】进制转换专题

M进制转N进制

3374. 进制转换2

#include <iostream>
#include <algorithm>
#include <cstring>
#include <vector>

using namespace std;

int main()
{
    int a, b;
    string s;
    cin >> a >> b >> s;
    vector<int> A;
    for(int i = s.size() - 1; i >= 0; i -- )  //高精度一般倒着存,方便去掉末尾(高位)零
        if(s[i] >= 'A') A.push_back(s[i] - 'A' + 10); //如果s[i]=A,则存11,为B,存12,依次类推
        else A.push_back(s[i] - '0');

    string res;
    if(res == "0") res = "0";
    else
    {
        /*
        直接将m进制转为n进制,但是在过程中会有一步转为10进制计算
        */
        while(A.size()) //短除法,若A不为0
        {
            int r = 0;
            for(int i = A.size() - 1; i >= 0; i -- )
            {
                A[i] += r * a; //将a进制的数转为10进制算
                r = A[i] % b; //余数,A[i]此时是a进制的数转为10进制的结果,模b进制
                A[i] /= b; //商
            }
            while(A.size() && A.back() == 0) A.pop_back();
            if(r < 10) res += to_string(r);
            else res += r - 10 + 'a'; //如果r=10,则输出a,是11,输出b,依次类推
        }
        reverse(res.begin(), res.end()); //余数是从上往下存的,要反转一下才是最终结果
    }
    cout << res << endl;
    return 0;
}

作者:NFYD
链接:https://www.acwing.com/activity/content/code/content/2478471/
来源:AcWing
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

十进制转B进制

1346. 回文平方


#include <iostream>
#include <algorithm>
#include <cstring>

using namespace std;

char get(int x) // 将x转化为b进制
{
    if(x <= 9) return x + '0';
    return x - 10 + 'A';
}

string base(int n, int b) // n 在 b 进制下的表示
{
    string num;
    while(n) num += get(n % b), n /= b;
    reverse(num.begin(), num.end());
    return num;
}

bool check(string num)
{
    for(int i = 0, j = num.size() - 1; i < j; i ++, j -- )
        if(num[i] != num[j])
            return false;
    return true;
}

int main()
{
    int b;
    cin >> b;
    for(int i = 1; i <= 300; i ++ )
    {
        string num = base(i * i, b);
        if(check(num))
            cout << base(i, b) << ' ' << num << endl;
    }
    return 0;
}

十进制转二进制

3373. 进制转换

#include <iostream>
#include <algorithm>
#include <cstring>
#include <vector>

using namespace std;

vector<int> div(vector<int> A, int b)
{
    vector<int> C;
    for(int i = A.size() - 1, r = 0; i >= 0; i -- )
    {
        r = r * 10 + A[i];
        C.push_back(r / b);
        r %= b;
    }
    reverse(C.begin(), C.end()); // 高精度都倒着存,方便去掉末尾(高位)的零
    while(C.size() && C.back() == 0) C.pop_back();
    return C;
}

int main()
{
    string s;
    while(cin >> s)
    {
        vector<int> A;
        //正着输入
        // for(int i = 0; i < s.size(); i ++ ) 
        //     A.push_back(s[s.size() - i - 1] - '0');
        for(int i = s.size() - 1; i >= 0; i -- ) // 倒着输入
            A.push_back(s[i] - '0');

        string res;
        if(s == "0") res = "0";
        else
        {
            while(A.size())
            {
                res += to_string(A[0] % 2);
                A = div(A, 2);
            }
        }
        reverse(res.begin(), res.end()); //存余数的时候是从上面开始存的,而二进制数是从下往上数,要反转一下
        cout << res << endl;
    }
    return 0;
}

作者:NFYD
链接:https://www.acwing.com/activity/content/code/content/2478234/
来源:AcWing
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

十进制转二进制+二进制逆序转十进制(高精度)

3395. 10进制 VS 2进制

写法一(除法写了余数,即标准高精度除法模板)

#include <iostream>
#include <algorithm>
#include <cstring>
#include <vector>

using namespace std;

typedef long long LL;

vector<int> div(vector<int>& A, int b, int &r)
{
    vector<int> C;
    r = 0;
    for (int i = A.size() - 1; i >= 0; i -- )
    {
        r = r * 10 + A[i];
        C.push_back(r / b);
        r %= b;
    }
    reverse(C.begin(), C.end());
    while (C.size() && C.back() == 0) C.pop_back();
    return C;
}

vector<int> mul(vector<int>& A, int b)
{
    vector<int> C;
    int t = 0;
    for (int i = 0; i < A.size(); i ++ )
    {
        if (i < A.size()) t += A[i] * b;
        C.push_back(t % 10);
        t /= 10;
    }
    if (t) C.push_back(t);
    while (C.size() > 1 && C.back() == 0) C.pop_back();
    return C;
}

vector<int> add(vector<int>& A, int b)
{
    vector<int> C;
    int t = b;
    for (int i = 0; i < A.size(); i ++ )
    {
        t += A[i];
        C.push_back(t % 10);
        t /= 10;
    }
    if (t) C.push_back(1);
    return C;
}

void print(vector<int>& A)
{
    for (int i = A.size() - 1; i >= 0; i -- )
        cout << A[i];
    cout << endl;
}

int main()
{
    string s;
    cin >> s;
    vector<int> A;
    for (int i = s.size() - 1; i >= 0; i -- )
        A.push_back(s[i] - '0');

    vector<int> B;
    while (A.size())
    {
        int r;
        A = div(A, 2, r);
        B.push_back(r);
    }
    vector<int> C; // vector默认为0,与int不同,int未赋初值是随机数
    for (auto c: B) // 秦九韶算法求二进制转十进制
    {
        C = mul(C, 2);
        C = add(C, c);
    }
    print(C);
    return 0;
}

作者:NFYD
链接:https://www.acwing.com/activity/content/code/content/6356956/
来源:AcWing
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

写法二:除法没写余数

#include <iostream>
#include <algorithm>
#include <cstring>
#include <vector>

using namespace std;

typedef long long LL;

vector<int> div(vector<int>& A, int b)
{
    vector<int> C;
    int r = 0;
    for (int i = A.size() - 1; i >= 0; i -- )
    {
        r = r * 10 + A[i];
        C.push_back(r / b);
        r %= b;
    }
    reverse(C.begin(), C.end());
    while (C.size() && C.back() == 0) C.pop_back();
    return C;
}

vector<int> mul(vector<int>& A, int b)
{
    vector<int> C;
    int t = 0;
    for (int i = 0; i < A.size(); i ++ )
    {
        if (i < A.size()) t += A[i] * b;
        C.push_back(t % 10);
        t /= 10;
    }
    if (t) C.push_back(t);
    while (C.size() > 1 && C.back() == 0) C.pop_back();
    return C;
}

vector<int> add(vector<int>& A, int b)
{
    vector<int> C;
    int t = b;
    for (int i = 0; i < A.size(); i ++ )
    {
        t += A[i];
        C.push_back(t % 10);
        t /= 10;
    }
    if (t) C.push_back(1);
    return C;
}

void print(vector<int>& A)
{
    for (int i = A.size() - 1; i >= 0; i -- )
        cout << A[i];
    cout << endl;
}

int main()
{
    string s;
    cin >> s;
    vector<int> A;
    for (int i = s.size() - 1; i >= 0; i -- )
        A.push_back(s[i] - '0');

    vector<int> B;
    while (A.size())
    {
        //int r;
        B.push_back(A[0] % 2);
        A = div(A, 2);

    }

    vector<int> C; // vector默认为0,与int不同,int未赋初值是随机数
    for (auto c: B) // 秦九韶算法求二进制转十进制
    {
        C = mul(C, 2);
        C = add(C, c);
    }
    print(C);
    return 0;
}

作者:NFYD
链接:https://www.acwing.com/activity/content/code/content/6356956/
来源:AcWing
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

十六进制转十进制

3452. 进制转换

写法一:正常写法

#include <iostream>

using namespace std;

int main()
{
    string s;
    while(cin >> s)
    {
        int sign = 1;
        if(s[0] == '-')
        {
            sign = -1;
            s = s.substr(3);
        }
        else s = s.substr(2);
        int res = 0;
        for(auto c : s)
        {
            int t = 0;
            if(isupper(c)) t = c - 'A' + 10;
            else if(islower(c)) t = c - 'a' + 10;
            else t = c - '0';
            res = res * 16 + t;
        }
        cout << res * sign << endl;
    }
    return 0;
}

写法二:cin可以直接读入十六进制的数

#include <iostream>

using namespace std;

int main()
{
    int x;
    while(cin >> hex >> x)
        cout << x << endl;
    return 0;
}

计算B进制的值(秦九韶算法)

image

4945. 比大小

#include <iostream>
#include <cstring>

using namespace std;

typedef long long LL;

LL get()
{
    LL res = 0;
    int n, b;
    cin >> n >> b;
    while (n -- )
    {
        int x;
        cin >> x;
        res = res * b + x; // 用res表示当前的值(同时也可表示上一位的值)
    }
    return res;
}

int main()
{
    LL res1 = get(), res2 = get();
    if (res1 > res2) cout << ">" << endl;
    else if (res1 < res2) cout << "<" << endl;
    else cout << "=" << endl;
    return 0;
}
posted @   Tshaxz  阅读(55)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 在鹅厂做java开发是什么体验
· 百万级群聊的设计实践
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性
· 全网最简单!3分钟用满血DeepSeek R1开发一款AI智能客服,零代码轻松接入微信、公众号、小程
Language: HTML
点击右上角即可分享
微信分享提示