基础练习 特殊回文数
试题
资源限制
时间限制:1.0s 内存限制:512.0MB
问题描述
给定n个十六进制正整数,输出它们对应的八进制数。
输入格式
输入的第一行为一个正整数n (1<=n<=10)。 接下来n行,每行一个由09、大写字母AF组成的字符串,表示要转换的十六进制正整数,每个十六进制数长度不超过100000。
输出格式
输出n行,每行为输入对应的八进制正整数。
【注意】 输入的十六进制数不会有前导0,比如012A。 输出的八进制数也不能有前导0。
样例输入
2 39 123ABC
样例输出
71 4435274
【提示】 先将十六进制数转换成某进制数,再由某进制数转换成八进制。
笔者碎碎念
笔者第一次看到提示,并没有深入去思考,而是按照老思路准备将十六进制数先转换成十进制数,再将十进制数转换成八进制。整个过程可谓是行云流水,写完后甚至觉得题目有点太过简单了,结果显而易见,笔者爆零了…于是我又重新审视了这个提示,恍然大悟,原来出题人已经提示至此。
实现思路
由图片我们不难发现,1位16(24)进制数可以变成1位2进制数,同理3位2进制数也可以变成1位8(23)进制数。因此可以考虑先将该16进制数(字符串格式)转换成2进制数,再去掉该2进制数的前导零,再判断其长度是否为3的倍数,若不为,则在高位补零保证长度为3的倍数。
完整代码
import java
.util
.Scanner
;
public class Main {
public static void main(String
[] args
) {
Question1();
}
public static void Question1() {
Scanner in
= new Scanner(System
.in
);
int n
= Integer
.parseInt(in
.nextLine());
int i
, j
;
String
[] sz
= new String[n
];
for (i
= 0; i
< n
; i
++) {
sz
[i
] = in
.next();
}
for(i
= 0; i
< sz
.length
; i
++) {
String s
= sz
[i
];
StringBuilder sb
= new StringBuilder();
for(j
= 0; j
< s
.length(); j
++) {
switch(s
.charAt(j
)) {
case '0':
sb
.append("0000");
break;
case '1':
sb
.append("0001");
break;
case '2':
sb
.append("0010");
break;
case '3':
sb
.append("0011");
break;
case '4':
sb
.append("0100");
break;
case '5':
sb
.append("0101");
break;
case '6':
sb
.append("0110");
break;
case '7':
sb
.append("0111");
break;
case '8':
sb
.append("1000");
break;
case '9':
sb
.append("1001");
break;
case 'A':
sb
.append("1010");
break;
case 'B':
sb
.append("1011");
break;
case 'C':
sb
.append("1100");
break;
case 'D':
sb
.append("1101");
break;
case 'E':
sb
.append("1110");
break;
case 'F':
sb
.append("1111");
break;
}
}
transform(sb
);
}
}
public static void transform(StringBuilder sb
) {
int num
= sb
.length() % 3;
switch(num
) {
case 0:
if(sb
.substring(0, 3).equals("000"))
sb
.delete(0, 3);
break;
case 1:
if(sb
.substring(0, 1).equals("0"))
sb
.delete(0, 1);
else sb
= sb
.insert(0, "00");
break;
case 2:
if(sb
.substring(0, 2).equals("00"))
sb
.delete(0, 2);
else sb
= sb
.insert(0, "0");
break;
}
StringBuilder res
= new StringBuilder();
int len
= sb
.length();
String
[] new_s1
= new String[len
/3];
for(int i
= 0; i
< len
/3; i
++) {
int tmp
= Integer
.parseInt(sb
.substring(i
* 3, i
* 3 + 3), 2);
res
.append(tmp
);
}
System
.out
.println(res
);
}
}
准备蓝桥杯时C/C++转Java初学者,算法略繁琐,欢迎评论指出不足! 同时也欢迎评论中提出问题!