题目
题目描述
给定一系列正整数,请按要求对数字进行分类,并输出以下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
解题思路
- 本题实际上是对除以5之后余数为0、1、2、3、4进行分类,显然可以想到用求余运算符。
- 有两种思路,一种是符合人类思维的,先把所有的数组存在一个数组中,数据也不多,内占用可以是常量级别的;另一种是输入一个直接开始计算统计,显然这种方法空间复杂度更低。
- 使用if还是switch:对复杂度没影响,都是可以的,switch使代码看起来更加整洁。
- 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;
}```