蓝桥杯之16进制转8进制

题目:

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

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

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

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

样例输入
  2
  39
  123ABC

样例输出
  71
  4435274

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

因为在蓝桥杯官网下的练习系统中使用的jdk版本为1.6,在1.6中switch方法貌似不支持判断字符串,所以就改成了if...elseif...的处理方式。

import java.util.Scanner;

public class Main {

/**
* @param args
*/
public static void main(String[] args) {

Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
String[] strs = new String[n];
for(int i=0;i<n;i++){
strs[i] = sc.next();
}
sc.close();

for(int j=0;j<n;j++){
String binary = toBinary(strs[j]);
if(binary.length()%3==2) binary = "0"+binary;
if(binary.length()%3==1) binary = "00"+binary;

System.out.println(toOctonary(binary));
}

}

public static String toOctonary(String s){
int z;
if(s.substring(0,3).equals("000"))
z = 3;
else {
z = 0;
}
int l = s.length();
StringBuffer sBuffer = new StringBuffer();
for(int i = z; i < l-2; i+=3){
if(s.substring(i,i+3).equals("000"))
sBuffer.append("0");
else if (s.substring(i,i+3).equals("001"))
sBuffer.append("1");
else if (s.substring(i,i+3).equals("010"))
sBuffer.append("2");
else if (s.substring(i,i+3).equals("011"))
sBuffer.append("3");
else if (s.substring(i,i+3).equals("100"))
sBuffer.append("4");
else if (s.substring(i,i+3).equals("101"))
sBuffer.append("5");
else if (s.substring(i,i+3).equals("110"))
sBuffer.append("6");
else if (s.substring(i,i+3).equals("111"))
sBuffer.append("7");
}
return sBuffer.toString();
}

public static String toBinary(String str){
StringBuffer sBuffer = new StringBuffer();
int l = str.length();
for(int i = 0; i < l; i++){
switch (str.charAt(i)) {
case ‘0‘:
sBuffer.append("0000");
break;
case ‘1‘:
sBuffer.append("0001");
break;
case ‘2‘:
sBuffer.append("0010");
break;
case ‘3‘:
sBuffer.append("0011");
break;
case ‘4‘:
sBuffer.append("0100");
break;
case ‘5‘:
sBuffer.append("0101");
break;
case ‘6‘:
sBuffer.append("0110");
break;
case ‘7‘:
sBuffer.append("0111");
break;
case ‘8‘:
sBuffer.append("1000");
break;
case ‘9‘:
sBuffer.append("1001");
break;
case ‘A‘:
sBuffer.append("1010");
break;
case ‘B‘:
sBuffer.append("1011");
break;
case ‘C‘:
sBuffer.append("1100");
break;
case ‘D‘:
sBuffer.append("1101");
break;
case ‘E‘:
sBuffer.append("1110");
break;
case ‘F‘:
sBuffer.append("1111");
break;
default:
break;
}
}

return sBuffer.toString();
}
}

这是参考了一位博客兄的文章在自己实践的,思路是基本参照他的。

1.利用循环读取控制台的输入

2.在16进制转2进制过程中,建立一个StringBuffer对象,利用了for循环+chatAt()方法一个一个地读取16进制数,读取到的字符利用switch方法去识别是0或1或2....到F,然后就利用StringBuffer对象的append()方法对应地追加"0000"或"0001"等等,在返回这个StringBuffer.toString()的字符串。

3.然后到了2进制转换为8进制。因为在上面中转换过来的二进制位数不一定是3的倍数(因为一个8进制数对应3位二进制数),所以对转换过来的2进制数进行补位数。在利用和转换16进制数差不多的方法前,需要注意的是题目要求中不允许输出的8进制数是0开头的,所以在这对二进制数进行了一次开头是3个000的就从3开始判断(题目说明输入的16进制不会是0开头的,所以只要做一次判断就可以了)。

4.通过以上的转换,就可以输出了,100分通过。

原文地址:https://www.cnblogs.com/z-jx/p/8541975.html

时间: 2024-10-15 17:45:14

蓝桥杯之16进制转8进制的相关文章

蓝桥杯基础练习 java 01字串 进制转换

问题描述 对于长度为5位的一个01串,每一位都可能是0或1,一共有32种可能.它们的前几个是: 00000 00001 00010 00011 00100 请按从小到大的顺序输出这32种01串. 输入格式 本试题没有输入. 输出格式 输出32行,按从小到大的顺序每行一个长度为5的01串. 样例输出 00000000010001000011<以下部分省略> 我的思路:定义字符串数组从0到31,for循环int值从0到31,将int型转化为2进制,得到字符串,再判断字符串的长度,不够5位前面补0,

蓝桥杯 BASIC 16 分解质因数(数学)

[思路]:先打表,后循环. [AC代码]: #include <iostream> #include <algorithm> #include <iomanip> #include <cstdio> #include <cmath> using namespace std; #define MAX 10000 int prime_list[MAX], cnt = 0; int isPrime(int n) { int i = 0; for (i

蓝桥杯 16进制转换8进制

蓝桥杯 16进制转换8进制 我表示我自己太渣渣了,总是超时,通不过测试. 题目 问题描述 给定n个十六进制正整数,输出它们对应的八进制数.输入格式 输入的第一行为一个正整数n (1<=n<=10). 接下来n行,每行一个由0~9.大写字母A~F组成的字符串,表示要转换的十六进制正整数,每个十六进制数长度不超过100000.输出格式 输出n行,每行为输入对应的八进制正整数.注意 输入的十六进制数不会有前导0,比如012A. 输出的八进制数也不能有前导0.样例输入239123ABC样例输出7144

java 16进制转换10进制

public static String toHexString2(byte[] b) { StringBuffer buffer = new StringBuffer(); for (int i = 0; i < b.length; ++i) { buffer.append(toHexString2(b[i])); } return buffer.toString(); } public static String toHexString2(byte b) { char[] buffer =

QT 16进制 ASII &nbsp; 10进制 转换

 //16进制字符串转字节数组     static QByteArray HexStrToByteArray(QString str)     {         QByteArray senddata;  //发送数据         int hexdata,lowhexdata;         int hexdatalen = 0;         int len = str.length();  //求出发送字符传唱度         senddata.resize(len/2); /

Java 10进制转2、8、16进制转换 / 2、8、16进制转10进制转换

public static void main(String[] args) { int i = 10; System.out.println("***********10进制转换2进制.8进制.16进制************"); System.out.println(Integer.toBinaryString(i)); // 10转换2进制 System.out.println(Integer.toOctalString(i)); // 10转换8进制 System.out.p

16进制与10进制

16进制 0 1 2 3 4 5 6 7 8 9 a b c d e f. 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 1 0 1 2(16进制中的10 进制表象,进位后,前边一位)10进制 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20我们的计算机中一般都以16进制保存.我们用的时间就是这种60进制中的10进制表象.

PHP进制转换[实现2、8、16、36、64进制至10进制相互转换]

自己写了一个PHP进制转换程序,一个类吧,第一次写这个东东,写这个东东,在处理文本文件时能用得到. 可以实现: 10进制转换2.8.16.36.62进制2.8.16.36.62进制转换10进制 有点要注意下,2.8.16进制转换时,使用的是系统的自己的函数. 所以,不管怎么高精度转换值可能大于2147483646. 另外, 32进制低精转换,最大值:2147483646: 32进制高精转换,最大值:77309411327: 64进制高精转换,最大值:133143986175. jinzhi.ph

十进制转换成十六进制、16进制转2进制

#include <stdio.h> #include <stdlib.h> #include <string.h> #include <locale.h> int main() { int i,v; char bs[33]; char b[33]; char hs[9]; char h[9]; char s[4]; char *e; // 十进制整数转二进制串: i=1024; ltoa(i,b,2); sprintf(bs,"%032s&quo