问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

算法分享:进制转换通用算法及示例

创作时间:
作者:
@小白创作中心

算法分享:进制转换通用算法及示例

引用
CSDN
1.
https://m.blog.csdn.net/2301_80303982/article/details/146163268

进制转换是编程和算法中的一个基础且重要的知识点。本文将分享几个常用的进制转换算法模板,并通过具体题目示例帮助读者更好地理解和掌握这些算法。

任意进制转十进制算法

将k进制的x转化为10进制的x

ll x=0;
for(int i=1;i<=n;++i)
{
x=x*k+a[i];
}
cout<<x<<endl;

十进制转任意进制算法

方法一

ll x;
cin>>x;
while(x)
{
a[++cnt]=x%k;
x/=k;
}
reverse(a+1,a+1+cnt);//翻转一下使得高位到1的位置

方法二(利用字符串)

这种方法更容易理解,特别是对于处理大数时。

char ch[] = { '0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F' };
string ans;
    while (x)//10进制再转m进制
    {
        ans += ch[x % m];
        x /= m;
    }
    reverse(ans.begin(), ans.end());//反向迭代器逆转输出
    cout << ans << endl;

任意进制下数位求和算法

这个函数可以计算任意进制下数的数位之和。

int sumposition(int n, int base)
{
    int sum = 0;
    while (n > 0)
    {
        sum += n % base;
        n /=base;
    }
    return sum;
}

题目一:十六进制转二进制

代码示例:

#include<iostream>
using namespace std;
using ll = long long;
const int N = 50;
int a[N];
int main()
{
    string s = "2021ABCD";
    for (int i = 0; i < s.length(); ++i)
    {
        if ('0' <= s[i] && s[i] <= '9')a[i + 1] = s[i] - '0';
        else a[i + 1] = s[i] - 'A' + 10;
    }
    ll x = 0;
    for (int i = 1; i <= s.length(); i++)
    {
        x = x * 16 + a[i];
    }
    cout << x << endl;
    return 0;
}

运行结果:

题目二:九进制转十进制

代码示例:

#include<iostream>
using namespace std;
using ll = long long;
const int N = 10;
int a[N];
int main()
{
    int n = 4;
    string s = "2022";
    for (int i = 1; i <= 4; i++)a[i] = s[i - 1] - '0';
    ll x = 0;
    for (int i = 1; i <= n; i++)x = x * 9 + a[i];
    cout <<x<< endl;
    return 0;
}

运行结果:

题目三:两次进制转换

这个题目需要先将N进制转10进制,再将10进制转m进制。

代码示例:

#include<iostream>
using namespace std;
using ll = long long;
const int N = 1000;
int a[N];
char ch[] = { '0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F' };
void solve()
{
    int n, m; cin >> n >> m;
    string s; cin >> s;
    int len = s.length();
    s = "#" + s;//方便从第一个位置开始处理
    for (int i = 1; i <= len; ++i)
    {
        if ('0' <= s[i] && s[i] <= '9')a[i] = s[i] - '0';
        else a[i] = s[i] - 'A' + 10;
    }
    ll x = 0;
    for (int i = 1; i <= len; ++i)x = x * n + a[i];//N进制先转10进制
    string ans;
    while (x)//10进制再转m进制
    {
        ans += ch[x % m];
        x /= m;
    }
    reverse(ans.begin(), ans.end());//反向迭代器逆转输出
    cout << ans << endl;
}
int main()
{
    ios::sync_with_stdio, cin.tie(0), cout.tie(0);
    int t;
    cin >> t;
    while (t--)solve();
    return 0;
}

运行结果:

题目四:时空传送门

这个题目需要计算1到2024中,在二进制和四进制下数位和相等的数的个数。

代码示例:

#include<iostream>
using namespace std;
//函数用于计算任意进制下数值的数位之和
int sumposition(int n, int base)
{
    int sum = 0;
    while (n > 0)
    {
        sum += n % base;
        n /=base;
    }
    return sum;
}
int main()
{
    int count = 0;
    for (int i = 1; i <= 2024; ++i)
    {
        int binarysum = sumposition(i, 2);
        int quatersum = sumposition(i, 4);
        if (binarysum == quatersum){
            ++count;
            }
    }
    cout << count << endl;
    return 0;
}

运行结果:

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号