十六进制转八进制 c++

十六进制转八进制 c++


本篇采用的方法是先将 16 进制数转为 10 进制数,再转为 8 进制数,但该方法存在一点问题,就是 c++ 的整型最长好像是long long,占据8个字节,也就是 64 位,能表示的数值有限,不适用于特别大的 16 进制数值转换,这个问题会导致在蓝桥杯的试题集中测试不通过,后面再改进(用字符表示,不用整型),本篇的代码能优化的地方很多,基本没什么技巧.

主要部分

  • 输入输出格式
  • 主函数 main
  • 16 进制转 10 进制函数 sixteenToTen
  • 10 进制转 8 进制函数 tenToEight

输入输出格式
在这里插入图片描述
第一行的 2 是要输入16 进制数值的个数
第二三行是输入的 2 个16 进制数值(字母必须大写,不能有 0 前缀)
最后两行是输出的结果

main部分

#include <iostream>
#include <cmath>
#include <string>
using namespace std;

int sixteenToTen(string a);
int tenToEight(int num);

int main()
{
    int n;
    long long eight_n, ten_n;
    cin >> n;
    string a[n];
    for (int i = 0; i < n; i++)
    {
        cin >> a[i];
    }
    for (int i = 0; i < n; i++)
    {
        ten_n = sixteenToTen(a[i]);
        eight_n = tenToEight(ten_n);
        cout << eight_n << endl;
    }
}

sixteenToTen函数
不同位置的数值乘以权重再相加,比如 16 进制 1A,10 进制为1*16^ 1+10*16^0 = 26

int sixteenToTen(string a)
{
    long long b = 0;
    int j = 0;
    for (int i = a.length() - 1; i >= 0; i--)
    {
        switch (a[j])
        {
        case 'A':
            b += 10 * pow(16, i);
            break;
        case 'B':
            b += 11 * pow(16, i);
            break;
        case 'C':
            b += 12 * pow(16, i);
            break;
        case 'D':
            b += 13 * pow(16, i);
            break;
        case 'E':
            b += 14 * pow(16, i);
            break;
        case 'F':
            b += 15 * pow(16, i);
            break;
        default:
            b += (a[j] - 48) * pow(16, i);
        }
        j++;
    }
    return b;
}

tenToEight函数
主要是将十进制数不停的除以 8,最后的余数是最高位,通过 i 变量来控制余数的位权,比如所得到的余数顺序是 17161,那么需要将其表示为16171(最终的 8 进制结果),最后输出的是整型

int tenToEight(int num)
{
    long long eight_num = 0;
  	int i = 0;
    while (true)
    {
        eight_num += num % 8 * pow(10, i);
        num = num / 8;
        if (num % 8 == num)
        {
            eight_num += (num % 8) * pow(10, i + 1);
            break;
        }
        i++;
    }
    return eight_num;
};
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值