【通过PAT复习C++与数据结构】PAT-B 1002.数字分类

题目

题目描述
给定一系列正整数,请按要求对数字进行分类,并输出以下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

解题思路

  1. 本题实际上是对除以5之后余数为0、1、2、3、4进行分类,显然可以想到用求余运算符。
  2. 有两种思路,一种是符合人类思维的,先把所有的数组存在一个数组中,数据也不多,内占用可以是常量级别的;另一种是输入一个直接开始计算统计,显然这种方法空间复杂度更低。
  3. 使用if还是switch:对复杂度没影响,都是可以的,switch使代码看起来更加整洁。
  4. A4是计算平均数,C++语法的话要引入,C++中用fixed以及setprecision 设置输出精度,控制格式化输入输出,也可以用printf控制。

代码

#include<iostream>
#include<stdio.h>
using namespace std;
int main()
{
	int N;
	cin>>N;
	int A1=0,A2=0,A3=0,A5=0;//题目要求输出的五个数字 
	int flag1=0,flag2=0,flag3=0,flag4=0,flag5=0;//flag用于判断是否存在相应的数字,不存在为0 
	int k=1;//k用于A2的交错求和 
	double A4=0;//A4要按题目要求输出浮点数 
	double sum; int num;//用于计算A4 
	int A;//A用于存放输入的数字 
	
	for(int i=1;i<=N;++i)
	{
		cin>>A;
		switch(A%5)
		{
			case 0: if(A%2==0) {flag1=1; A1+=A;}break;
			case 1:flag2=1;A2+=k*A;k=-k;break;
			case 2:flag3=1; ++A3;break;
			case 3:flag4=1; sum+=A; ++num;break;
			case 4:flag5=1; if(A>A5) A5=A;break;
		}
		
	}
	A4=sum/num;
	(flag1==1)?(cout<<A1<<" "):(cout<<"N ");//三目运算符可以看我上一篇文章 
	(flag2==1)?(cout<<A2<<" "):(cout<<"N ");
	(flag3==1)?(cout<<A3<<" "):(cout<<"N ");
	(flag4==1)?(printf("%.1f ",A4)):(printf("N "));
	(flag5==1)?(cout<<A5):(cout<<"N");
	return 0;
}```

猜你喜欢

转载自blog.csdn.net/qq_41010971/article/details/86086963
今日推荐