PAT乙类之1012 数字分类 (20 分)

一、 题目

给定一系列正整数,请按要求对数字进行分类,并输出以下 5 个数字:
A​1= 能被 5 整除的数字中所有偶数的和;
A​2= 将被 5 除后余 1 的数字按给出顺序进行交错求和,即计算 n1−n2+n3−n4⋯;
A3= 被 5 除后余 2 的数字的个数;
A4= 被 5 除后余 3 的数字的平均数,精确到小数点后 1 位;
A​5= 被 5 除后余 4 的数字中最大数字。

输入格式:
每个输入包含 1 个测试用例。每个测试用例先给出一个不超过 1000 的正整数 N,随后给出 N 个不超过 1000 的待分类的正整数。数字间以空格分隔。

输出格式:
对给定的 N 个正整数,按题目要求计算 A​1~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

二、代码

易错点

  1. 第八个测试点过不去: 单独处理 i=1!!!
    之所以过不去是因为如果交错求和等于0,那么岂不是就直接输出"N"了。 所以用k来计数!!!

新的技巧和方法

  1. 关于输出多余空格的新方法:
     if(i!=0) cout<<" ";     //一行代码直接搞定!!!!
  1. switch(n % 5) :
    n % 5直接就是结果! 不用再再添加多余的额外函数!!!
    比如bool divideFive(int n) 返回处理之后的结果!!
  2. 交错求和

a[1] += pow( -1, count ) x;* //记住pow函数

  1. 关于 i 如果不同会有不同的结果的问题!!
    if条件单独处理i
   if( i == 1){}
    if(i==2) {}
    ...... //(普通的情况)

分析

  1. 整体有5种可能,所以采用switch语句可能较为方便。但是直接switch(n % 5) 就可以!!
  2. 输出代码,可以采用三元运算符。(看的别人代码,觉得很简洁,在此摘录)
(a[0]>0)?(cout<0)?(cout<0)?(cout<0)?(cout<
  1. 注意最后一个测试点
#include 
#include 
using namespace std;


int main() {
	int a[5] = {0};
	float j = 0.0;
	int n, count;
	cin >> count;
	int k=0;
	while(count--) {
		cin >> n;
		switch(n % 5) {
			case 0:
				if( n%2 == 0) {
					a[0]+=n;
				}
				break;
			case 1:
				if(k % 2 == 0) {
					a[1]+=n;
					k++;
				}else {
					a[1]-=n;
					k++;
				}
				break;
			case 2:
				a[2]++;
				break;
			case 3:
				a[3] += n;
				j++;
				break;
			case 4:
				if( n > a[4]) {
					a[4] = n;
				}
				break;
		}
	}
	
	for(int i=0; i<5; i++) {
		if(i!=0) cout<<" ";
		if(i == 1) {
			if(k != 0) {
				printf("%d", a[1]);
				continue;
			}else {
				printf("N");
				continue;
			}
		}
		if(a[i] == 0) {
			printf("N");
		}else if(i == 3){
			printf("%0.1f", a[i]/j);
		}else {
			printf("%d", a[i]);
		}

	}
	return 0;
	
}

你可能感兴趣的:(PAT)