目录
1012:数字分类
输入格式:
输出格式:
输入样例 1:
输出样例 1:
输入样例 2:
输出样例 2:
代码长度限制:
时间限制:
内存限制:
思路:
1.变量存储
1.2代码:
大坑,好多坑:
坑点1:对于A1,如果所有偶数和为0,是输出0还是N。
坑点2:对于A2,如果所有符合条件的数字的交错求和的值为0,是输出0还是N。
完整代码:
总结:
题目链接:
1012:数字分类
给定一系列正整数,请按要求对数字进行分类,并输出以下 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
代码长度限制:
16 KB
时间限制:
400 ms
内存限制:
64 MB
思路:
1.变量存储
对于每一类数字,我们都用一个变量进行存储就行了,总的来说特别的简单:
1.2代码:
while(n--){ //输入n个数进行分类
int a;
cin>>a; //输入一个数字
if(a%5==0&&a%2==0) //如果是第一类数字
s1+=a,x++; //s1是求和,x是代表有几类这样的数字
if(a%5==1){ //如果是第二类数字
if(i%2==0) //利用奇偶数性质判断是该+a还是-a
s2+=a; //加上a
else //用奇偶数性质判断是该+a还是-a
s2-=a; //减去a
i++; //i是代表奇偶数性质的,也是看这一类数字出现了几次1
}
if(a%5==2) //如果是第三类数字的话
s3++; //计数器加上1
if(a%5==3) //如果是第四类数字的话
s4+=(float)a,j++; //加上这个数,因为前面是int类型的,最后要求平均数,要强制转换一下
if(a%5==4) //如果是第五类数字的话 //j是看第四类数字出现了几次的计数器
s5=max(s5,a),y++; //用max函数来找里面最大的一个数,y是看第五类数字出现了几次的计数器
}
大坑,好多坑:
首先看看输入样例和输出样例:
坑点1:对于A1,如果所有偶数和为0,是输出0还是N。
解答:看样例2: A1输出为N,但输入中明显5是符合A1要求的。因此当所有偶数和为0时,不输出0,输出N,这我们就需要进行一次判断了,我们就可以用在数字分类中记录每一类数字的计数器进行判断。
坑点2:对于A2,如果所有符合条件的数字的交错求和的值为0,是输出0还是N。
解答:槽点来了,A1、A2明明都有可能求和后值为0,但数组内却有数,但是它们的输出情况却不统一。对于A2,交错求和后的值为0但数组内有数字时,输出0(这一点在样例中并没有体现)。这一点与A1的输出情况完全相反。(你说坑不坑,我当初就是被坑了,所以我才在数字分类的时候给每一类数字加上了计数器)
完整代码:
#include<bits/stdc++.h>
using namespace std;
int main(){
float n=0,s1=0,s2=0,s3=0,s4=0.0; //每一种分类最后的输出
int i=0,s5=0,j=0,x=0,y=0; //很多计数器
cin>>n; //输入输入的数字数量
while(n--){ //输入n个数进行分类
int a;
cin>>a; //输入一个数字
if(a%5==0&&a%2==0) //如果是第一类数字
s1+=a,x++; //s1是求和,x是代表有几类这样的数字
if(a%5==1){ //如果是第二类数字
if(i%2==0) //利用奇偶数性质判断是该+a还是-a
s2+=a; //加上a
else //用奇偶数性质判断是该+a还是-a
s2-=a; //减去a
i++; //i是代表奇偶数性质的,也是看这一类数字出现了几次1
}
if(a%5==2) //如果是第三类数字的话
s3++; //计数器加上1
if(a%5==3) //如果是第四类数字的话
s4+=(float)a,j++; //加上这个数,因为前面是int类型的,最后要求平均数,要强制转换一下
if(a%5==4) //如果是第五类数字的话 //j是看第四类数字出现了几次的计数器
s5=max(s5,a),y++; //用max函数来找里面最大的一个数,y是看第五类数字出现了几次的计数器
}
//输出第一类数字:
if(x==0) //如果没有
cout<<"N "; //就输出'N'
else //有第一类数字
cout<<s1<<" "; //就讲第一类数字的和s1输出
//输出第二类数字:
if(i==0) //如果计数器为0,也就是没有第二类的数字
cout<<"N "; //就输出'N'
else //有第二类的数字
cout<<s2<<" "; //输出利用奇偶数性质求加减的和差s2
//输出第三类数字:
if(s3==0) //如果计数器为0,也就是没有第三类的数字
cout<<"N "; //输出'N'
else //如果有第三类的数字
cout<<s3<<" "; //输出第三类数字的个数s3
//输出第四类数字:
if(j==0) //如果计数器为0,也就是没有第四类的数字
cout<<"N "; //输出'N'
else //如果有第四类的数字
printf("%.1lf ",s4/(float)j); //利用printf输出第四类数字s4/第四类数字的个数,也就是平均数
//题目要求是输出1位小数,所以利用printf的时候要加%.1lf
//输出第五类数字
if(y==0) //如果计数器为0,也就是没有第五类数字
cout<<"N"; //输出'N'
else //如果有第五类数字
cout<<s5; //输出第五位数字中最大的哪一个
return 0;
}
总结:
这道题看起来超级简单,连算法都不需要用,学过语法的都可以做出来,但是,这道题坑太多了,我都落入了好几次,需要非常的细致,比如说加上计数器等等等等,这些都是可能AC题目的关键!
题目链接:
PTA | 程序设计类实验辅助教学平台千名教师建设,万道高质量题目,百万用户拼题的程序设计实验辅助教学平台https://pintia.cn/problem-sets/994805260223102976/exam/problems/994805311146147840