题目一:十六进制转八进制
问题描述:
给定n个十六进制正整数,输出它们对应的八进制数。
输入、输出格式:
输入的第一行为一个正整数n (1<=n<=10)。
接下来n行,每行一个由09、大写字母AF组成的字符串,表示要转换的十六进制正整数,每个十六进制数长度不超过100000。(时间限制:1.0s,内存限制:512.0MB)
输出n行,每行为输入对应的八进制正整数。
【注意】
输入的十六进制数不会有前导0,比如012A。
输出的八进制数也不能有前导0。
解决思路:
-
本题应先将十六进制数转换成二进制再转换成八进制。
-
本题存储输入的数组需要用String类型,因为题目告知:每个十六进制数长度不超过100000,而long型变量无法存储这么大的值。
-
为了方便后面二进制转八进制,可以先在十六进制数前补零。
-
不要忘记最后的八进制结果要去除前导零。
解决代码:
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
String[] s = new String[n];
for(int i = 0; i < n; i++) {
s[i] = sc.next();
}
for(int i = 0; i < n; i++) {
StringBuffer sb = new StringBuffer(); // 存储二进制结果
if(s[i].length() * 4 % 3 == 1) {
sb.append("00"); // 刚好与多的1位组成3个0,即8进制的1位
} else if(s[i].length() * 4 % 3 == 2) {
sb.append("0");
}
// 十六进制----->二进制
for(int j = 0; j< s[i].length(); j++) {
switch(s[i].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;
}
}
long num = 0; // 存储八进制结果的每一位
StringBuffer sf = new StringBuffer(); // 存储八进制结果
// 二进制----->八进制
for(int m = 0; m < sb.length(); m += 3) { // 每三位三位地转换
// 'c'-'0'------>实现字符到数字的转化
num = (sb.charAt(m) - '0') * 4 + (sb.charAt(m + 1) - '0') * 2 + (sb.charAt(m+2) - '0');
sf.append(num);
}
// 去除八进制数的前导0
if(sf.substring(0,1).equals("0")) {
System.out.print(sf.substring(1));
} else {
System.out.print(sf);
}
System.out.println();
}
}
}
题目二:数列排序
问题描述:
给定一个长度为n的数列,将这个数列按从小到大的顺序排列。1<=n<=200(时间限制:1.0s,内存限制:512.0MB)
输入、输出格式:
第一行为一个整数n。
第二行包含n个整数,为待排序的数,每个整数的绝对值小于10000。
输出一行,按从小到大的顺序输出排序后的数列。
解决思路:
直接使用Arrays类的sort()即可。
解决代码:
import java.util.Arrays;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
sc.nextLine();
Long[] arr = new Long[n];
for(int i = 0; i < n; i++) {
arr[i] = sc.nextLong();
}
Arrays.sort(arr);
for(int i = 0; i < n; i++) {
System.out.print(arr[i] + " ");
}
}
}
题目三:时间转换
问题描述:
给定一个以秒为单位的时间t,要求用"H:M:S"的格式来表示这个时间。H表示时间,M表示分钟,而S表示秒,它们都是整数且没有前导的"0"。例如,若t=0,则应输出是"0:0:0";若t=3661,则输出"1:1:1"。(时间限制:1.0s,内存限制:512.0MB)
输入、输出格式:
输入只有一行,是一个整数t(0<=t<=86399)。
输出只有一行,是以"H:M:S"的格式所表示的时间,不包括引号。
解决代码:
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
long t = sc.nextLong();
long h = t / 3600;
long m = (t - h * 3600) / 60;
long s = t - h * 3600 - m * 60;
System.out.println(h + ":" + m + ":" + s);
}
}