时间限制:1.0s 内存限制:512.0MB
问题描述
给定n个十六进制正整数,输出它们对应的八进制数。
输入格式
输入的第一行为一个正整数n (1<=n<=10)。
接下来n行,每行一个由09、大写字母AF组成的字符串,表示要转换的十六进制正整数,每个十六进制数长度不超过100000。
输出格式
输出n行,每行为输入对应的八进制正整数。
【注意】
输入的十六进制数不会有前导0,比如012A。
输出的八进制数也不能有前导0。
样例输入
2
39
123ABC
样例输出
71
4435274
【提示】
先将十六进制数转换成某进制数,再由某进制数转换成八进制。
此题这种做法是错的,原因是因为数据太大了,超过了long的范围
import java.util.Scanner;
public class Demo04 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
while(n-- > 0){
String str = sc.next();
long t = Long.parseLong(str, 16); //将16进制的数转化为10进制数
System.out.println(Long.toOctalString(t));//将10进制的数转为8进制的数
}
}
}
正确做法,16进制转8进制,就是将以前的4位改成3为
1010 1001 1010
101 010 011 010
如果下面一行不是3的倍数,向前补0;
import java.util.Scanner;
public class Demo04 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
while(n-- > 0){
String str = sc.next();
StringBuffer s = new StringBuffer(100008);
char c;
int t = 0;
for (int i = 0; i < str.length(); i++) {
c = str.charAt(i);
switch(c)
{
case '0':s.append("0000");break;
case '1':s.append("0001");break;
case '2':s.append("0010");break;
case '3':s.append("0011");break;
case '4':s.append("0100");break;
case '5':s.append("0101");break;
case '6':s.append("0110");break;
case '7':s.append("0111");break;
case '8':s.append("1000");break;
case '9':s.append("1001");break;
case 'A':s.append("1010");break;
case 'B':s.append("1011");break;
case 'C':s.append("1100");break;
case 'D':s.append("1101");break;
case 'E':s.append("1110");break;
case 'F':s.append("1111");break;
default:break;
}
}
int len = s.length();
if(len % 3 == 1){
len+=2;
s.insert(0, "00");
}
if(len % 3 == 2){
s.insert(0, "0");
}
if(4*s.charAt(0)+2*s.charAt(1)+s.charAt(2)-7*'0' != 0)
System.out.print(4*s.charAt(0)+2*s.charAt(1)+s.charAt(2)-7*'0');
for (int i = 3; i < s.length(); i+=3) {
System.out.print(4*s.charAt(i)+2*s.charAt(i+1)+s.charAt(i+2)-7*'0');
}
System.out.println();
}
}
}
这题我居然用了string拼接,卡的要死,给你们看一张图就知道了
-
加号 “+”
-
String contact() 方法
-
StringUtils.join() 方法
-
StringBuffer append() 方法
-
StringBuilder append() 方法