第十四届蓝桥杯集训——练习解题阶段(无序阶段)-试题 基础练习 十六进制转八进制

简介: 第十四届蓝桥杯集训——练习解题阶段(无序阶段)-试题 基础练习 十六进制转八进制

第十四届蓝桥杯集训——练习解题阶段(无序阶段)-试题 基础练习 十六进制转八进制


前言

       最近的一些文章都可能会很碎,写到哪里是哪里,过一阵子会具体的整理一遍,这里其它的类型题先往后排一排,因为蓝桥最后考的也就是对题目逻辑的理解能力,也就是dp分析能力了,所以就主要目标定在这里,最近的题目会很散,很多,基本上都是网罗全网的一些dp练习题进行二次训练,准备比赛的学生底子薄的先不建议看啊,当然,脑子快的例外,可以直接跳过之前的一切直接来看即可,只需要你在高中的时候数学成绩还可以那就没啥问题,其实,dp就是规律总结,我们只需要推导出对应题目的数学规律就可以直接操作,可能是一维数组,也可能是二维数组,总体来看二维数组的较多,但是如果能降为的话建议降为,因为如果降为起来你看看时间复杂度就知道咋回事了,那么在这里祝大家能无序的各种看明白,争取能帮助到大家。


十六进制转八进制

资源限制

内存限制:512.0MB   C/C++时间限制:1.0s   Java时间限制:3.0s   Python时间限制:5.0s

问题描述

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

输入格式

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

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

输出格式

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

  【注意】

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

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

样例输入

2

39

123ABC

样例输出

71

4435274

【提示】

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

题解:

C语言

由于没有函数帮着处理只能自己写操作,超级麻烦。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MaxSize 100000
void saveB(char *b,char c3,char c2,char c1,char c0,int start)
{
  b[start]=c3;
  b[start+1]=c2;
  b[start+2]=c1;
  b[start+3]=c0;
}
int htob(char *h,char *b)
{
  int i,j;
  int hl=strlen(h);
  for(i=0;i<hl;i++)
    switch(h[i])
    {
      case '0':
        {
          saveB(b,'0','0','0','0',4*i);
          break;
        }
      case '1':
        {
          saveB(b,'0','0','0','1',4*i);
          break;
        }
      case '2':
        {
          saveB(b,'0','0','1','0',4*i);
          break;
        }
      case '3':
        {
          saveB(b,'0','0','1','1',4*i);
          break;
        }
      case '4':
        {
          saveB(b,'0','1','0','0',4*i);
          break;
        }
      case '5':
        {
          saveB(b,'0','1','0','1',4*i);
          break;
        }
      case '6':
        {
          saveB(b,'0','1','1','0',4*i);
          break;
        }
      case '7':
        {
          saveB(b,'0','1','1','1',4*i);
          break;
        }
      case '8':
        {
          saveB(b,'1','0','0','0',4*i);
          break;
        }
      case '9':
        {
          saveB(b,'1','0','0','1',4*i);
          break;
        }
      case 'A':
        {
          saveB(b,'1','0','1','0',4*i);
          break;
        }
      case 'B':
        {
          saveB(b,'1','0','1','1',4*i);
          break;
        }
      case 'C':
        {
          saveB(b,'1','1','0','0',4*i);
          break;
        }
      case 'D':
        {
          saveB(b,'1','1','0','1',4*i);
          break;
        }
      case 'E':
        {
          saveB(b,'1','1','1','0',4*i);
          break;
        }
      case 'F':
        {
          saveB(b,'1','1','1','1',4*i);
          break;
        }
    }
  return 4*hl;
}
int btoo(char *b,char *o,int bl)
{
  int i,j;
  int ol;
  int value;
  if(bl%3==0)
    ol=bl/3;
  else
    ol=bl/3+1;
  j=bl-1;
  for(i=ol-1;i>=0;i--)
  {
    if(i>0)
      o[i]=b[j]-48+(b[j-1]-48)*2+(b[j-2]-48)*4+48;
    else
    {
      switch(j)
      {
        case 2:
          o[i]=b[j]-48+(b[j-1]-48)*2+(b[j-2]-48)*4+48;
          break;
        case 1:
          o[i]=b[j]-48+(b[j-1]-48)*2+48;
          break;
        case 0:
          o[i]=b[j];
          break;
      }
    }
    j=j-3;
  }
  return ol;
}
void printO(char *o,int ol)
{
  int i=0;
  if(o[0]=='0')
    i=1;
  for(;i<ol;i++)
  {
    printf("%c",o[i]);
  }
  printf("\n");
}
main()
{
  char h[MaxSize];
  char b[4*MaxSize];
  char o[4*MaxSize/3+1];
  int n,i,bl,ol;
  scanf("%d",&n);
  getchar();
  for(i=0;i<n;i++)
  {
    gets(h);
    bl=htob(h,b);
    ol=btoo(b,o,bl);
    
    printO(o,ol);
  }
}

C++语言

也是由于没有函数,所以非常麻烦。

#include <iostream>
#include <stdio.h>
#include <string.h>
#include <STDLIB.H>
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
int GetI(char c)
{
  return c>>4&1?c&15:(c&15)+9; 
}
int main(int argc, char *argv[]) {
  char arr[200001] = {'\0'};
  char brr[400001] = {'\0'};
  int n = 0;
  int i = 0;
  scanf("%d",&n);
  for(i = 0;i < n;i++)
  {
    scanf("%s",arr);
    int m[3] = {1,16,256};
    int len = strlen(arr);
    int j = len-1;
    int a,b,c;
    a = b = c = 0;
    int k = 0,l = 0;
    int count = 0;
    while(j>-1)
    {
      a += (arr[j]>>4&1?arr[j]&15:(arr[j]&15)+9)*m[k]; //个位
      if(k==2||j==0)
      {
        while(a)
        {
          brr[l++] = ((a&7)|48);
          a = a>>3;
          count++;
        }
        while(j!=0&&count<4)
        {
          brr[l++] = '0';
          count++;
        }
        count = 0;
      }
      k = (k+1)%3;
      j--;
    }
    strrev(brr);
    printf("%s\n",brr);
    memset(arr,'\0',(sizeof(char)*200001));
    memset(brr,'\0',(sizeof(char)*400001));
  }
    return 0; 
}

Java语言

用函数很方便,但是我们也可以自己来写。

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Main{
  public static void main(String[] args)throws NumberFormatException,
    IOException  
{
BufferedReader buf = new BufferedReader(
        new InputStreamReader(System.in));
int n = Integer.parseInt(buf.readLine());
int l = 0,j=0,k=0,p=0;
String m1="";
String m2="";
char arr[];
String ss[] = new String[n];
while ((n--)!=0)
{
    m1=buf.readLine();
    l=m1.length();
    m2=hexToBinary(m1);
    l=m2.length();
    switch(l%3){
        case 1:m2="00"+m2;break;
        case 2:m2="0"+m2;break;
        default:break;
    }
    arr=new char [m2.length()/3];
    for ( k=0,j=0;k<m2.length()-2;k+=3)
    {
        char c=(char)((m2.charAt(k)-'0')*4+(m2.charAt(k+1)-'0')*2+(m2.charAt(k+2)-'0')+'0');
        if (k==0&&c=='0')
        {
            continue;
        }
        arr[j]=c;j++;
    }
    ss[p]=new String(arr);
    p++;
}
for (int i=0;i<p ;i++ )
{
    System.out.println(ss[i]);
}
}
public static String hexToBinary(String hexNum){
char[] chs = {'0','1'};
String str = new String("0123456789ABCDEF");
char[] charArray = hexNum.toCharArray();
int pos = charArray.length*4;
char[] binaryArray = new char[pos];
for (int i = charArray.length - 1; i >=0; i--) {
    int temp = str.indexOf(charArray[i]);
    for(int j=0;j<4;j++){
        binaryArray[--pos] = chs[temp & 1];
        temp = temp >>> 1;
    }
}
return new String(binaryArray);
}
    }

Python语言

Python语言既然简介,那么咱们就更简洁一些。

n = int(input())
for i in range(0,n):
    num = eval("0x"+input().strip())
    print("%o" % (num))

总结

其实在正式解题的时候我们利用Java的函数也能直接的解出来,还是非常方便的呢。当然也可以使用Python的那种形式,Java也有。

没有什么不付出就能拿到的结果,我们都是在负重前行,最终结果与自身先天的脑力有一定的关系,但是还是有很大一部分看自己后天的努力,其实从报名到比赛也就5个月左右,真正刷题的事件也就2个月,2个月回忆一下你真正的认真刷过题吗,如果你真的用尽所有的精力去努力了,那么我相信你最终的成绩一定会让你满意的,加油。


相关文章
|
6月前
|
人工智能 算法 Java
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-1005 数字游戏
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-1005 数字游戏
107 0
|
1月前
|
人工智能 Python
蓝桥杯练习题(四):Python组之历届试题三十题
关于蓝桥杯Python组历届试题的三十个练习题的总结,包括题目描述、输入输出格式、样例输入输出以及部分题目的解题思路和代码实现。
30 0
蓝桥杯练习题(四):Python组之历届试题三十题
|
6月前
|
机器学习/深度学习 人工智能 算法
2024 蓝桥杯本科B组试题
2024 蓝桥杯本科B组试题
114 0
|
6月前
|
算法 Java C语言
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-1007 印章
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-1007 印章
62 0
|
6月前
|
算法 Java C语言
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-1006 拿金币
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-1006 拿金币
66 0
|
6月前
|
人工智能 算法 Java
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-992 士兵杀敌(二)
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-992 士兵杀敌(二)
79 1
|
6月前
|
Java C语言 C++
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-1000 kAc给糖果你吃
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-1000 kAc给糖果你吃
82 0
|
6月前
|
算法 Java C语言
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-999 数的潜能
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-999 数的潜能
83 0
|
6月前
|
算法 Java C语言
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-997 粘木棍
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-997 粘木棍
89 0
|
6月前
|
机器学习/深度学习 算法 Java
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-996 车的放置
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-996 车的放置
91 0