十六进制转八进制 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;
};