大数据十六进制转八进制

本文涉及的产品
云原生大数据计算服务MaxCompute,500CU*H 100GB 3个月
云原生大数据计算服务 MaxCompute,5000CU*H 100GB 3个月
简介: 大数据十六进制转八进制

今天在做蓝桥杯题目的时候看到一题十六进制转八进制的题目,题目如下:


问题描述


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


输入格式

 

输入的第一行为一个正整数n (1<=n<=10)。

 

接下来n行,每行一个由0~9、大写字母A~F组成的字符串,表示要转换的十六进制正整数,每个十六进制数长度不超过100000。


输出格式

 

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


注意


 输入的十六进制数不会有前导0,比如012A。

 输出的八进制数也不能有前导0。


样例输入

2
39
123ABC

样例输出

71
4435274


提示


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


十六进制转化为八进制最直接想到的有两种方法:


 1.将十六进制转换为十进制再转换为八进制


 2.将十六进制转换为二进制再转换为八进制


分析:在第一种方法中用int类型来储存十进制数的话那么最大能处理80 000 000(H)也就是 2147483648 (D),本题要求处理大数据,那么必须用数组储存。用第一种方法就涉及到了大整数的加法,模,除法。


第二种方法相对于第一种方法而言比较容易,只用定义一个字符数组就可以储存二进制数,每一个十六进制可以转换为4位2进制数,然后每3位二进制数可以转换为一个八进制数,在本题中输入的十六进制没有前导零,所以在十六进制最高的四位最小出现“0001”若最后三位相加为0那么就不输出即可。


以下是实现代码

#include <stdio.h>
#include <string.h>
#include <ctype.h>
#define N 100001
char str[N];
void prin(char *a,int n)
{
  int i;
  for(i=n-1;i>=0;i--){
    printf("%d",a[i]);
  }
  putchar('\n');
}
void change(int use)
{
  int num=0;
  char two[N*4];
  int  w[4]={1,2,4,8};
  int i=0,j=0,cnt2=0,cnt8=0;
  //totwo 
  while(use>=0){
    num=isdigit(str[use])?str[use]-'0':str[use]-'A'+10;
    use--;
     for(i=0;i<4;i++){
      two[cnt2++]=num&w[i];
     }
  }
  //twoto
  for(i=0;i<cnt2;){ 
    for(num=0,j=0; i<cnt2&&j<3 ;j++){
      if(two[i++]) num+=w[j];
    }
    two[cnt8++]=num;
  }
  if(!two[cnt8-1]) cnt8--;
  //printf
  for(i=cnt8-1;i>=0;i--)
  {
    printf("%d",two[i]);
  }
  putchar('\n');
}
int main(void)
{
  int n;
  scanf("%d",&n);
  if(n>=1&&n<=10){
    while(n--){
      scanf("%s",str);
      change(strlen(str)-1);
    }
  }
  return 0; 
}

20150124144641004.jpg


对于上述方法浪费的空间太大!我利用C语言对于底层的操作,位运算可以大大减少空间复杂度以及时间复杂度

实现如下


#include <stdio.h>
#include <string.h>
#include <ctype.h>
#define N 100001
char str[N];
int save=0;
void change(int use,int state)
{
  int num;
  if(use>=0){
    if(state!=3){
      num=isdigit(str[use])?str[use]-'0':str[use]-'A'+10;
      num<<=state;
      num|=save;
      save=num>>3;
      change(use-1,state+1);
      printf("%d",num%8);
    }else{
      num=save;
      save>>=3;
      change(use,0);
      printf("%d",num%8);
    }
  }else{
    if(save){
      printf("%d",save);
      save=0;
    } 
  }
}
int main(void)
{
  int num;
  scanf("%d",&num);
  if(num>=1&&num<=10){
  while(num--){
    scanf("%s",str);
     change(strlen(str)-1,0); 
    printf("\n");
  }
  }
  return 0;
}


20150124145015484.jpg


内存使用之所以不降反升的原因是因为使用了递归

(作者水平有限,欢迎大家讨论批评)


相关实践学习
基于MaxCompute的热门话题分析
本实验围绕社交用户发布的文章做了详尽的分析,通过分析能得到用户群体年龄分布,性别分布,地理位置分布,以及热门话题的热度。
SaaS 模式云数据仓库必修课
本课程由阿里云开发者社区和阿里云大数据团队共同出品,是SaaS模式云原生数据仓库领导者MaxCompute核心课程。本课程由阿里云资深产品和技术专家们从概念到方法,从场景到实践,体系化的将阿里巴巴飞天大数据平台10多年的经过验证的方法与实践深入浅出的讲给开发者们。帮助大数据开发者快速了解并掌握SaaS模式的云原生的数据仓库,助力开发者学习了解先进的技术栈,并能在实际业务中敏捷的进行大数据分析,赋能企业业务。 通过本课程可以了解SaaS模式云原生数据仓库领导者MaxCompute核心功能及典型适用场景,可应用MaxCompute实现数仓搭建,快速进行大数据分析。适合大数据工程师、大数据分析师 大量数据需要处理、存储和管理,需要搭建数据仓库?学它! 没有足够人员和经验来运维大数据平台,不想自建IDC买机器,需要免运维的大数据平台?会SQL就等于会大数据?学它! 想知道大数据用得对不对,想用更少的钱得到持续演进的数仓能力?获得极致弹性的计算资源和更好的性能,以及持续保护数据安全的生产环境?学它! 想要获得灵活的分析能力,快速洞察数据规律特征?想要兼得数据湖的灵活性与数据仓库的成长性?学它! 出品人:阿里云大数据产品及研发团队专家 产品 MaxCompute 官网 https://www.aliyun.com/product/odps&nbsp;
相关文章
|
4月前
|
Java C++ Python
试题 基础练习 十六进制转八进制
试题 基础练习 十六进制转八进制
45 0
|
3月前
用人话教会你各个进制的意思和进制间的转化!!!
用人话教会你各个进制的意思和进制间的转化!!!
|
4月前
|
存储 安全 程序员
|
4月前
|
存储 C++
【软件设计师备考 专题 】数制基础:二进制、十进制和十六进制的理解与转换
【软件设计师备考 专题 】数制基础:二进制、十进制和十六进制的理解与转换
29 1
|
4月前
|
存储 Java 程序员
基本概念【变量和数据类型和运算符、二进制和十进制、十进制转二进制 、二进制转十进制 】(一)-全面详解(学习总结---从入门到深化)
基本概念【变量和数据类型和运算符、二进制和十进制、十进制转二进制 、二进制转十进制 】(一)-全面详解(学习总结---从入门到深化)
60 0
蓝桥杯基础训练】十六进制转八进制
给定n个十六进制正整数,输出它们对应的八进制数。
69 0
一日一技:装逼技能,口算二进制转八进制和十六进制
一日一技:装逼技能,口算二进制转八进制和十六进制
120 0
|
数据可视化 大数据 索引
|
Python
Python编程:二进制,八进制,十六进制与十进制之间的转换
Python编程:二进制,八进制,十六进制与十进制之间的转换
106 0
Python编程:二进制,八进制,十六进制与十进制之间的转换