zl程序教程

您现在的位置是:首页 >  其他

当前栏目

给定n个十六进制正整数,输出它们对应的八进制数。

输出 对应 给定 它们 十六进制 正整数 八进制
2023-09-11 14:20:19 时间

蓝桥杯基础算法:

问题描述
  给定n个十六进制正整数,输出它们对应的八进制数。

输入格式
  输入的第一行为一个正整数n (1<=n<=10)。
  接下来n行,每行一个由09、大写字母AF组成的字符串,表示要转换的十六进制正整数,每个十六进制数长度不超过100000。

输出格式
  输出n行,每行为输入对应的八进制正整数。

【注意】
  输入的十六进制数不会有前导0,比如012A。
  输出的八进制数也不能有前导0。

样例输入
  2
  39
  123ABC

样例输出
  71
  4435274

【提示】
  先将十六进制数转换成某进制数,再由某进制数转换成八进制。

题中说了“每个十六进制数长度不超过100000”,所以不能先转换成10进制,再转换成8进制。我们可以采用字符型,将输入的16进制数看成字符串,转换后的2进制字符串,每三位二进制数可以组成一位新的八进制字符。



#include<stdio.h>
#include<iostream>
#include<string>
#include<string.h>
#include<math.h>
using namespace std;
//利用switch+string类型
//注意字符串要双引号
int main() {
    int n;
    string str_temp, str_in;
    scanf_s("%d", &n);
    for (int i = 0; i < n; i++)
    {
        str_in = "";
        str_temp = "";//给字符串赋空

        cin >> str_in;//输入你的十六进制值
        int len = str_in.length();
        for (int j = 0; j < len; j++) {
            switch (str_in[j]) {//string头文件包含了类string可以近似理解字符串数组
            case '0': str_temp += "0000"; break;
            case '1': str_temp += "0001"; break;
            case '2': str_temp += "0010"; break;
            case '3': str_temp += "0011"; break;
            case '4': str_temp += "0100"; break;
            case '5': str_temp += "0101"; break;
            case '6': str_temp += "0110"; break;
            case '7': str_temp += "0111"; break;
            case '8': str_temp += "1000"; break;
            case '9': str_temp += "1001"; break;
            case 'A': str_temp += "1010"; break;
            case 'B': str_temp += "1011"; break;
            case 'C': str_temp += "1100"; break;
            case 'D': str_temp += "1101"; break;
            case 'E': str_temp += "1110"; break;
            case 'F': str_temp += "1111"; break;
            default: break;
            }
        }
        int len_s = str_temp.length();
        int ans = 2;
        int sum = 0;
        int r = len % 3;//八进制是三个二进制数组成,看有多少个余的二进制数

        if (r == 1) {
            if (str_temp[0] == '1')
                printf("1");
        }
        else if (r == 2) {
            if (str_temp[0] == '0' && str_temp[1] == '1')
                printf("1");
            else if (str_temp[0] == '1' && str_temp[1] == '0')
                printf("2");
            else if (str_temp[0] == '1' && str_temp[1] == '1')
                printf("3");
        }
        else {
            if (str_temp[0] == '0' && str_temp[1] == '0' && str_temp[2] == '0')
                r = 3;
        }

        for (int i = r; i < len_s; i++)
        {
            if (str_temp[i] == '1')
                sum += pow(2, ans);
            ans--;//计数器,每三位一个循环
            if (ans == -1)
            {
                printf("%d", sum);//输出八进制数字每三位
                ans = 2;
                sum = 0;
            }
        }
        printf("\n");
    }
}

代码运行结果:
在这里插入图片描述