目录
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-试题 基础练习 十六进制转八进制
最近的一些文章都可能会很碎,写到哪里是哪里,过一阵子会具体的整理一遍,这里其它的类型题先往后排一排,因为蓝桥最后考的也就是对题目逻辑的理解能力,也就是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
【提示】
先将十六进制数转换成某进制数,再由某进制数转换成八进制。
题解:
由于没有函数帮着处理只能自己写操作,超级麻烦。
#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);
}
}
也是由于没有函数,所以非常麻烦。
#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;
}
用函数很方便,但是我们也可以自己来写。
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语言既然简介,那么咱们就更简洁一些。
n = int(input())
for i in range(0,n):
num = eval("0x"+input().strip())
print("%o" % (num))
其实在正式解题的时候我们利用Java的函数也能直接的解出来,还是非常方便的呢。当然也可以使用Python的那种形式,Java也有。