题目:
这道题对于java来讲,乍一看,转换是一行代码就可以搞定的。
//octo是八进制字符串;
//hex是16进制字符串;
String octo = Integer.toOctalString(Integer.valueOf(hex, 16));
16进制先转成10进制再转成8进制,调用函数还是so easy的!
不过运行后的结果是:运行错误
知道吗,在测试集中存在长度为10万的16进制字符串,这意味着,整型的溢出。
int类型不行,Long当然也不行!
所以这样的方法自然行不通!
接着我就开始了csdn之旅!
先感谢Poison_up和diadestiny两位博主。
我尝试的第一种方法是第一位博主的切割法
因为字符串太长,直接转换成10进制会超出整型的范围,而3位16进制的二进制位长度与4位8进制的二进制位长度同是12位,所以将16进制字符串从尾开始每三个字符一份,转化成4位8进制,转化用的是上面的那段代码,三位16进制远小于int型的最大值。
不过写出来放到网上去跑,结果是:运行超时
我尝试的第二种方法是16进制–>2进制–>8进制
思路就是:1位十六进制对应4位二进制,3位二进制对应1位八进制。java代码如下:
import java.util.HashMap;
import java.util.Scanner;
public class Main {
static HashMap<Character, String> maphex =new HashMap<Character, String>();
public static void init()
{
maphex.put('0', "0000");
maphex.put('1', "0001");
maphex.put('2', "0010");
maphex.put('3', "0011");
maphex.put('4', "0100");
maphex.put('5', "0101");
maphex.put('6', "0110");
maphex.put('7', "0111");
maphex.put('8', "1000");
maphex.put('9', "1001");
maphex.put('A', "1010");
maphex.put('B', "1011");
maphex.put('C', "1100");
maphex.put('D', "1101");
maphex.put('E', "1110");
maphex.put('F', "1111");
}
public static String binToOctal(char[] bin)//二进制转成8进制
{
char[] octal = new char[bin.length/3 + (bin.length%3==0 ? 0:1)];
int index = octal.length - 1;
for(int i = bin.length - 1; i >= 0; i--)
{
int sum = bin[i] - '0';
if(i-1>=0)
sum += (bin[--i] - '0') * 2;
if(i-1>=0)
sum += (bin[--i] - '0') * 4;
octal[index--] = (char)(sum+'0');
}
//去掉最前面的0
int begin = 0;
while(octal[begin] == '0')
begin++;
return String.copyValueOf(octal, begin, octal.length-begin);
}
public static void main(String[] args) {
//输入
Scanner scan = new Scanner(System.in);
int n = scan.nextInt();
String[] str = new String[n];
scan.nextLine();
for(int i = 0; i< n; i++)
{
str[i] = scan.nextLine();
}
init();//初始化哈希映射
for(String hex : str)//开始转化
{
char[] bin = new char[hex.length()*4];
int index = 0;
for(Character c : hex.toCharArray())//16进制转换为2进制
{
String temp = maphex.get(c);
for(int i=0;i<4;i++)
bin[index++] = temp.charAt(i);
}
System.out.println(binToOctal(bin));
}
}
}
第二位博主C++代码跑出来的结果是
比我写的java更优!