• 蓝桥杯: 基础练习 十六进制转八进制


    蓝桥杯: 基础练习 十六进制转八进制

    问题

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

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

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

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

    样例输入
      2
      39
      123ABC

    样例输出
      71
      4435274

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

    分析

    100000长度的十六进制数,字符串很长,用数组切段做。

    3位十六进制 = 12位二进制 = 4位八进制。

    偷懒使用C++ string的字符截取函数substr(),截取3位十六进制数后,再偷懒使用sscanf转成十进制,最后偷懒使用printf直接输出八进制,输出注意开头前导零。

    从前面截取开始的话,开头可能不足3位十六进制,用长度取模3,得到开头需要取得的长度,之后就都取3位。

    代码

    #include <iostream>
    #include <cstdio>
    #include <cstring>
    using namespace std;
    int main(){
    	int n=0;
    	scanf("%d",&n);
    	int num,pos,len;
    	char c[4];
    	string str;
    	for (int j = 0; j < n; ++j){
    		cin >> str;
    		len = str.length();
    		pos = len % 3;
    		if(pos){
    			strcpy(c,str.substr(0,pos).c_str());
    			sscanf(c,"%X",&num);
    			printf("%o", num);
    		}
    		for (int i = pos; i <= len-3; i+=3){
    			strcpy(c,str.substr(i,3).c_str());
    			sscanf(c,"%X",&num);
    			printf("%04o", num);
    		}
    		printf("
    ");
    	}
    	return 0;
    }
    
  • 相关阅读:
    了解windows下的npm
    “jupyter notebook 不能导入python库但是终端上可以实现”的问题的解决
    本地创建的jupyter notebook 无法连接本地环境(即不能运行代码)
    win10 + ubuntu 下右键新建md文件(转载)
    LeetCode刷题2
    【入门】离散化
    【10.5NOIP普及模拟】sum
    【10.5NOIP普及模拟】sort
    【2020.02.01NOIP普及模拟4】怪兽
    [图论]最小花费
  • 原文地址:https://www.cnblogs.com/swordgrass/p/13899326.html
Copyright © 2020-2023  润新知