PAT乙级Basic Level真题
1.A+B和C(15)
题目描述:
给定区间[-2的31次方, 2的31次方]内的3个整数A、B和C,请判断A+B是否大于C。
总结:
1.Java 中 int 型长度[-2^31 , 2^31 - 1],此题中,范围到2^31,所以用Long代替。
2.不用编译器写代码好多都记不清应该怎么写了。
3.ArrayList后面是引用数据类型,只能用Integer 。Java 中 int 和 Integer 的区别
代码:
import java.util.*;
public class Main{
static private ArrayList<Long> A = new ArrayList<>();
static private ArrayList<Long> B = new ArrayList<>();
static private ArrayList<Long> C = new ArrayList<>();
static private int turn;
public static void main(String[] args){
Scanner scan = new Scanner(System.in);
turn = scan.nextInt();
if(turn>10) System.exit(0);
for(int i=0;i<turn;i++){
Long t = scan.nextLong();
if(t>Math.pow(2,31) || t<Math.pow(-2,31)) System.exit(0);
A.add(t);
t = scan.nextLong();
B.add(t);
t = scan.nextLong();
C.add(t);
}
for(int i=0;i<turn;i++){
System.out.println("Case #"+(i+1)+": "
+ m.compare(A.get(i),B.get(i),C.get(i)));
}
}
protected static boolean compare(Long a,Long b,Long c){
return a + b > c;
}
}
2.数字分类 (20)
题目描述:
给定一系列正整数,请按要求对数字进行分类,并输出以下5个数字:
A1 = 能被5整除的数字中所有偶数的和;
A2 = 将被5除后余1的数字按给出顺序进行交错求和,即计算 n1-n2+n3-n4…;
A3 = 被5除后余2的数字的个数;
A4 = 被5除后余3的数字的平均数,精确到小数点后1位;
A5 = 被5除后余4的数字中最大数字。
总结:
1.注意题目要求是按行输出还是一行输出。不要形成习惯
2.Math.pow()返回值类型是double,进行运算时要强制类型转换,比较大小可以不用。
(int) Math.pow(-1,ex++)
代码:
import java.util.*;
public class Main{
private static int n;
private static ArrayList<Integer> numbers = new ArrayList<>();
private static int a1 = 0;
private static boolean s1 = false;
private static int a2 = 0;
private static boolean s2 = false;
private static int a3 = 0;
private static int a4 = 0;
private static int count = 0;
private static int a5 = -1;
public static void main(String[] args){
Scanner scan = new Scanner(System.in);
n = scan.nextInt();
for(int i=0;i<n;i++){
Integer t = scan.nextInt();
numbers.add(t);
}
fun();
}
public static void fun(){
int ex = 0;
for(int i=0;i<numbers.size();i++){
Integer t = numbers.get(i);
if(t%5==0 && t%2==0) {s1 = true; a1 += t;}
if(t%5==1) {s2 = true; a2 = a2 + t * (int) Math.pow(-1,ex++);}
if(t%5==2) a3++;
if(t%5==3) {count++;a4 += t;}
if(t%5==4) {if(t>a5) a5 = t;}
}
if(s1) System.out.print(a1 + " "); else System.out.print("N ");
if(s2) System.out.print(a2 + " "); else System.out.print("N ");
if(a3!=0) System.out.print(a3 + " "); else System.out.print("N ");
if(a4!=0) System.out.print(String.format("%.1f", (float)a4/count) + " "); else System.out.print("N ");
if(a5!=-1) System.out.print(a5); else System.out.print("N");
}
}
3.数素数 (20)
题目描述:
令Pi表示第i个素数。现任给两个正整数M <= N <= 10000,请输出PM到PN的所有素数。
总结:
1.输出的最后一行如果只到一半就结束了,最后一个不能有空格。
2.最小的素数是2。
代码:
import java.util.*;
public class Main {
private static boolean flag = false;
private static int a;
private static int b;
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
a = scan.nextInt();
b = scan.nextInt();
if (a > 10000 || b > 10000) System.exit(0);
int i = 2;
int count = 0;
while (count != b) {
flag = false;
for (int j = 2; j <= Math.sqrt(i); j++) {
if (i % j == 0) {
flag = true;
}
}
if (!flag) {
count++;
if(count>=a&&count<=b){
System.out.print(i);
if ((count-a+1) % 10 != 0 && count!=b) System.out.print(" ");
else if(count!=b) System.out.print("\n");
}
}
i++;
}
}
}
4.福尔摩斯的约会 (20)
题目描述:
大侦探福尔摩斯接到一张奇怪的字条:“我们约会吧! 3485djDkxh4hhGE 2984akDfkkkkggEdsb s&hgsfdk d&Hyscvnm”。大侦探很快就明白了,字条上奇怪的乱码实际上就是约会的时间“星期四 14:04”,因为前面两字符串中第1对相同的大写英文字母(大小写有区分)是第4个字母’D’,代表星期四;第2对相同的字符是’E’,那是第5个英文字母,代表一天里的第14个钟头(于是一天的0点到23点由数字0到9、以及大写字母A到N表示);后面两字符串第1对相同的英文字母’s’出现在第4个位置(从0开始计数)上,代表第4分钟。现给定两对字符串,请帮助福尔摩斯解码得到约会的时间。
总结:
1.String[] day = {"MON","TUE","WED","THU","FRI","SAT","SUN"};
String 数组的初始化使用花括号。
2.char charAt(int index);
可以获得字符串指定位置的字符。
3.char[] toCharArray();
可以将字符串转换为字符类数组,值可以用==比较。
4.Math.min()
获得最小值。
5.第一个:大写英文字母;第二个:字符;第三个:英文字母。
代码:
import java.util.*;
public class Main{
private static String[] day = {"MON","TUE","WED","THU","FRI","SAT","SUN"};
public static void main(String[] args){
Scanner scan = new Scanner(System.in);
String s1 = scan.next();
String s2 = scan.next();
String s3 = scan.next();
String s4 = scan.next();
char c = s1.charAt(date(s1,s2));
System.out.print(day[c-'A']+" ");
String s5 = s1.substring(date(s1,s2)+1);
String s6 = s2.substring(date(s1,s2)+1);
c = s5.charAt(hour(s5,s6));
if(c<'9') System.out.print("0"+(c-'0')+":");
else System.out.print((10+c-'A') +":");
if(minute(s3,s4)<10) System.out.print("0"+minute(s3,s4));
else System.out.print(minute(s3,s4));
}
public static int date(String s1,String s2){
char[] arr1 = s1.toCharArray();
char[] arr2 = s2.toCharArray();
int i;
for(i = 0;i<Math.min(arr1.length,arr2.length);i++){
if(arr1[i]==arr2[i] && arr1[i]>='A' && arr1[i]<='Z') break;
}
return i;
}
public static int hour(String s1,String s2){
char[] arr1 = s1.toCharArray();
char[] arr2 = s2.toCharArray();
int i;
for(i = 0;i<Math.min(arr1.length,arr2.length);i++){
if(arr1[i]==arr2[i]) break;
}
return i;
}
public static int minute(String s1,String s2){
char[] arr1 = s1.toCharArray();
char[] arr2 = s2.toCharArray();
int i;
for(i = 0;i<Math.min(arr1.length,arr2.length);i++){
if(arr1[i]==arr2[i] && arr1[i]>='A' && arr1[i]<='z') break;
}
return i;
}
}
5.德才论 (25)
题目描述:
宋代史学家司马光在《资治通鉴》中有一段著名的“德才论”:“是故才德全尽谓之圣人,才德兼亡谓之愚人,德胜才谓之君子,才胜德谓之小人。凡取人之术,苟不得圣人,君子而与之,与其得小人,不若得愚人。”
现给出一批考生的德才分数,请根据司马光的理论给出录取排名。
总结:
1.常用ASCII码要背过。
2.需要import
的:import java.util.ArrayList;
3.由于main()方法是static,所以在main()
函数里使用的所有变量、函数,全部要加static。
为什么java的main方法必须是静态的
主要原因是为了让JVM调用这个方法时不需要创建实例
4.字符串长度length()
是函数。
5.字符串变字符数组:char[] id_array = id.toCharArray();