给定一系列正整数,请按要求对数字进行分类,并输出以下 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
关键之处:
- 这题是五个部分简单题的拼凑,但综合起来容易有小错误。
- 交错和那里,我以 sum 为 if 的判定条件,然而交错和有正有负可能和为0,所以要另用 k 作为标记。
代码:
#include <stdio.h>
#define MAXN 1000
void A1 ( int a[], int N );
void A2 ( int a[], int N );
void A3 ( int a[], int N );
void A4 ( int a[], int N );
void A5 ( int a[], int N );
int main(void) {
int N, i;
int a[MAXN] = {0};
scanf("%d", &N);
for ( i = 0; i < N; i++ )
scanf("%d", &a[i]);
A1(a, N);
A2(a, N);
A3(a, N);
A4(a, N);
A5(a, N);
return 0;
}
void A1 ( int a[], int N ) {
int i, sum = 0;
for ( i = 0; i < N; i++ )
if ( a[i] % 5 == 0 && a[i] % 2 == 0 ) sum += a[i];
if ( sum ) printf("%d ", sum);
else printf("N ");
}
void A2 ( int a[], int N ) {
int i, sum, flag, k;
sum = 0, flag = 1, k = 0;
for ( i = 0; i < N; i++ )
if ( a[i] % 5 == 1 ) {
sum += (flag * a[i]);
flag = -flag;
k = 1; //这里卡了好久,因为交错和sum可能为0,所以要用另一个标记k。
}
if ( k ) printf("%d ", sum);
else printf("N ");
}
void A3 ( int a[], int N ) {
int i, count = 0;
for ( i = 0; i < N; i++ )
if ( a[i] % 5 == 2 ) count++;
if ( count ) printf("%d ", count); //count身兼二职,当分母和看有无余数为2的数。
else printf("N ");
}
void A4 ( int a[], int N ) {
int i, count = 0;
float sum = 0;
for ( i = 0; i < N; i++ )
if ( a[i] % 5 == 3 ) {
sum += a[i];
count++;
}
if ( count ) printf("%.1f ", sum / (float)count);
else printf("N ");
}
void A5 ( int a[], int N ) {
int i, max = 0;
for ( i = 0; i < N; i++ )
if ( a[i] % 5 == 4 && a[i] > max) max = a[i];
if ( max ) printf("%d\n", max);
else printf("N\n");
}