个人主页:mzwang.top
数字分类
题目描述:
给定一系列正整数,请按要求对数字进行分类,并输出以下 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
。输入样例:
13 1 2 3 4 5 6 7 8 9 10 20 16 18
输出样例:
30 11 2 9.7 9
题目来源:PAT乙级1012
作者:CHEN, Yue
单位:浙江大学
注:点击文章底部的 阅读原文
可直接进入本题在线评测系统
问题解决:
解题思想
定义数组A[5]和flag[5],用A[0]-A[4]存下各类要求的计算结果,用flag[0]~flag[4]来标记某类数字是否存在。在一次对数组a[MAXN]的遍历中对5种情况分别进行统计,最后按格式要求输出即可。注意,除A[3]外,其它4种情况输出格式相同,可统一处理,A[3]要特殊处理。
代码示例(C)
小提示:左右滑动代码可查看全部内容
#include <stdio.h>
#define MAXN 1001
int main()
{
int n,i,j = 1,count = 0,a[MAXN];
//A[0]~A[4]存下各类要求的计算结果
int A[5] = {0};
//用flag[0]~flag[4]来标记某类数字是否存在
int flag[5] = {0};
scanf("%d",&n);
for(i = 0; i < n; i++){
scanf("%d",&a[i]);
}
for(i = 0; i < n; i++){
if((a[i] % 5 == 0)&&(a[i] % 2 == 0)){
A[0] += a[i];
flag[0] = 1;
}
else if(a[i] % 5 == 1){
//用j辅助进行交错求和
A[1] += (j * a[i]);
j = -j;
flag[1] = 1;
}
else if(a[i] % 5 == 2){
A[2]++;
flag[2] = 1;
}
else if(a[i] % 5 == 3){
A[3] += a[i];
count++;
flag[3] = 1;
}
else if(a[i] % 5 == 4){
if(flag[4] == 0){
A[4] = a[i];
}
else{
if(A[4] < a[i]){
A[4] = a[i];
}
}
flag[4] = 1;
}
}
for(i = 0; i < 5; i++){
//除A[3]部分要求用浮点形式输出,其它均为整型格式
if((flag[i] == 1)&&(i != 3)){
printf("%d",A[i]);
}
else if(flag[i] == 0){//不存在时输出N
printf("N");
}
if((i == 3)&&(flag[i] == 1)){
printf("%.1f",(double)(1.0 * A[3] / count));
}
if(i != 4){
printf(" ");
}
}
return 0;
}