PAT训练笔记:乙级真题---数字分类 (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”。

输入例子:

13 1 2 3 4 5 6 7 8 9 10 20 16 18

输出例子:

30 11 2 9.7 9

二、我的AC代码

#include<stdio.h>
#include<math.h>

int main(){
	int n, a1, a2, a3, a5, a, i, j, c, d, e;
	float k, a4;
	scanf("%d", &n);
	a1 = a2 = a3 = a4 = a5 = d = 0;
	for( i = 1, j = 0, k = 0.0; i <= n; i++){
		scanf("%d", &a);
		switch (a % 5){
			case 0 : if(a % 2 == 0) a1 += a; break;
			case 1 : a2 += pow(-1, j) * a; j++; break;
			case 2 : a3++; break;
			case 3 : a4 += a; k++; break;
			case 4 : if( a > a5) a5 = a; d++;
		}
//		if(a%5 == 0 && a % 2 == 0)
//			a1 += a;
//		else if( a % 5 == 1){
//			a2 += pow(-1, j) * a;
//			j++;
//		}
//		else if( a % 5 == 2)
//			a3++;
//		else if( a % 5 == 3){
//			a4 += a;
//			k++;
//		}
//		else if( a % 5 == 4){
//			if( a > a5){
//				a5 = a;
//			}
//		}	
	} 
	
	if(a1) printf("%d ", a1);
	else printf("N ");
	if(j != 0) printf("%d ", a2);
	else printf("N ");
//	直接判断j即可,只要j大于零,那么就输出a2的值。 
	if(a3 != 0) printf("%d ", a3);
	else printf("N ");
	if(k) printf("%.1f ", a4/k);
	else printf("N ");
	if(d) printf("%d", a5);
	else printf("N");
}

三、心得相关

一、题目分析:

  • 考点一:数据的输入输出;

  • 考点二:基本循环、判断语法;

二、心得体会

  • 这个题目里面有些特殊情况要考虑:交错求和结果为0时,不代表第二类数字不存在,所以我在这里添加了一个变量用来判断是否有进行第二类数字的计算,如果有进入第二类数字的计算,直接最后可以输出这个值。
  • 在计算交错级数时,我是用的乘方:a^b,然后发现输出有问题,后面才知道这个是按二进制进行异或操作。如果要实现我需要的乘方操作,需要用到 pow( , )这个数学函数;

  • 另外再有就是,自己开始用的是if分支语句,略显臃肿,改为switch语句之后看起来就更简洁舒服了;

  • 发现自己的代码可读性还是较差,a, i, j, c, d, e;这部分数据,不能一目了然,应该像有些同学写的那样,count1、count2……这样就对应了计算第几类数字的辅助变量,增加了代码的可读性。

猜你喜欢

转载自blog.csdn.net/qq_41914687/article/details/103942118