第十四届蓝桥杯集训——练习解题阶段(无序阶段)-试题 基础练习 十六进制转八进制
前言
最近的一些文章都可能会很碎,写到哪里是哪里,过一阵子会具体的整理一遍,这里其它的类型题先往后排一排,因为蓝桥最后考的也就是对题目逻辑的理解能力,也就是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个月回忆一下你真正的认真刷过题吗,如果你真的用尽所有的精力去努力了,那么我相信你最终的成绩一定会让你满意的,加油。