给定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");
}
}
代码运行结果:
相关文章
- 多进程交替控制输出
- R_Studio(关联)使用apriori函数简单查看数据存在多少条关联规则,并按支持度降序排序输出
- C#中格式化数据的输出
- ContentNegotiatingViewResolver多种输出格式实例: json/jsp/xml/xls/pdf
- 牛客网 C++ 输入、输出常用格式
- 实现输出大小写字母
- 过滤列表或命令的输出的项
- 用saltapi远程操作tomcat启停时,输出日志乱码再解决
- C# 格式化输出
- 如何将编译Log输出到文件中
- PTA — 表格输出 (5 分)
- 成功解决如何去掉输出字典,前边的dict_keys
- 习题 3.2 设圆半径r=1.5, 圆柱高h=3, 求圆周长、圆面积、圆球表面积、圆球体积、圆柱体积。用cin输入数据,输出计算结果,输出时要求有文字说明,取小数点后两位数字。请编程序。
- 解答私信@icey�192 //2021-11-1 C++ 已知1900是鼠年,输入一个年份,输出其对应的生肖。
- 67键键盘如何输出`和~符号(一百五十一)