常在河边走,哪能不湿鞋?用java写PTA终于被制裁了哈哈哈哈。有几个死活过不去,没办法,上网上搜,网上的基本都是全部超时,我的还是部分超时QAQ。
一、题干
1012 数字分类 (20)(20 分)
给定一系列正整数,请按要求对数字进行分类,并输出以下5个数字:
A1 = 能被5整除的数字中所有偶数的和;
A2 = 将被5除后余1的数字按给出顺序进行交错求和,即计算n1-n2+n3-n4...;
A3 = 被5除后余2的数字的个数;
A4 = 被5除后余3的数字的平均数,精确到小数点后1位;
A5 = 被5除后余4的数字中最大数字。
输入格式:
每个输入包含1个测试用例。每个测试用例先给出一个不超过1000的正整数N,随后给出N个不超过1000的待分类的正整数。数字间以空格分隔。
输出格式:
对给定的N个正整数,按题目要求计算A1~A5并在一行中顺序输出。数字间以空格分隔,但行末不得有多余空格。
若其中某一类数字不存在,则在相应位置输出“N”。
输入样例1:
13 1 2 3 4 5 6 7 8 9 10 20 16 18
输出样例1:
30 11 2 9.7 9
输入样例2:
8 1 2 4 5 6 7 9 16
输出样例2:
N 11 2 N 9
二、分析
老规矩,数据获取:
public static int[] getData() throws IOException {
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));
String string = bufferedReader.readLine();
String[] targetString = string.split(" ");
int size = Integer.parseInt(targetString[0]);
int[] target = new int[size];
for (int i = 0 ; i < target.length ; i ++)
target[i] = Integer.parseInt(targetString[i + 1]);
return target;
}
之后就是进行数据的处理,得出中间结果(我贴的是主操作流程的代码):
public static void main() throws IOException {
int[] target = getData();
int A1Sum = 0;//A1结果
int A2Count = 0;//A2计数变量
int A2Sum = 0;//A2结果
int A3Count = 0;//A3结果
int A4Sum = 0;//A4求和
int A4Count = 0;//A4计数
boolean A2F = true;//因为可能A2Count得到的是0
int A5Max = 0;
for (int i = 0 ; i < target.length ; i ++) {
switch (target[i] % 10) {
case 1:
case 6:
if (A2Count % 2 == 0)
A2Sum += target[i];
else
A2Sum -= target[i];
A2Count ++;
A2F = false;
break;
case 2:
case 7:
A3Count ++;
break;
case 3:
case 8:
A4Sum += target[i];
A4Count ++;
break;
case 4:
case 9:
if (target[i] > A5Max)
A5Max = target[i];
break;
case 0:
A1Sum += target[i];
break;
}
}
convert(A1Sum, A2Sum, A2F, A3Count, A4Sum, A4Count, A5Max);
}
最后是将中间结果转化成格式化的输出
public static void convert(int a1, int a2, boolean A2F, int a3, int a4, int a4p, int a5) {
StringBuilder stringBuilder = new StringBuilder();
if (a1 == 0) {
stringBuilder.append("N ");
} else {
stringBuilder.append(a1 + " ");
}
if (A2F) {
stringBuilder.append("N ");
} else {
stringBuilder.append(a2 + " ");
}
if (a3 == 0) {
stringBuilder.append("N ");
} else {
stringBuilder.append(a3 + " ");
}
if (a4p == 0) {
stringBuilder.append("N ");
} else {
double result = a4 / (double)a4p;
DecimalFormat decimalFormat = new DecimalFormat("#.0");
stringBuilder.append(decimalFormat.format(result) + " ");
}
if (a5 == 0) {
stringBuilder.append("N");
} else {
stringBuilder.append(a5);
}
System.out.println(stringBuilder.toString());
}
有点长,不过也没啥,值得注意的是格式化double类型的值我用了DecimalFormat,反正网上也能搜到
最后是调用语句:
public static void main(String[] args) throws IOException {
main();//真是简洁到让人想哭的调用语句
}
只能通过三个用例,但是牛客网上可以通过全部。
真令人绝望~