1012 数字分类
分数 20
作者 CHEN, Yue
单位 浙江大学
输入格式:
每个输入包含 1 个测试用例。每个测试用例先给出一个不超过 1000 的正整数 N,随后给出 N 个不超过 1000
的待分类的正整数。数字间以空格分隔。
输出格式:
输入样例 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、输出一组数据,第一个数表示后面会有多少数量的数输入,
scanf("%d",&n);
第二个之后的数%5取余。
我用的数组a[i]去存储。
for (int i=0;i<n;i++){
scanf("%d",&a[i]);
}
然后判断取余是是多少【0,1,2,3,4】,根据题目要求输出结果。
for (int i=0;i<n;i++){
scanf("%d",&a[i]);
if(a[i]%5==0){}
if(a[i]%5==1){}
...
printf()
}
2、A1的要求:能被 5 整除的数字中所有偶数的和;
有三个判断要求:
- 第一是被 5 整除的数字:a[i]%5==0
- 第二是其中的偶数:a[i]%2==0
- 第三是偶数和:a1=a1+a[i]
第一和第二个判断条件时并且的关系,用&&来连接。
if(a[i]%5==0&&a[i]%2==0){
a1=a1+a[i];
}
3、A2的要求:
有三个判断要求:
- 第一,被5整除后余1的数:a[i]%5==1
- 第二,给出顺序进行求和:a2=a2+a[i];
- 第三,给出顺序进行交错求和:
定义两个变量:
int mn=1,x=-1;
每一次计算之后,使得mn*x,使得形成符号转变。
if(a[i]%5==1){
a2=a2+mn*a[i];
mn=mn*x;
}
4、A3的要求:被 5 除后余 2 的数字的个数。
有两个判断要求:
- 第一:被 5 除后余 2 的数字:a[i]%5==2
- 第二:数字的个数:a3=a3+1
if(a[i]%5==2){
a3=a3+1;
}
5、A4的要求:被 5 除后余 3 的数字的平均数,精确到小数点后 1 位;
有三个判断要求:
- 第一:被 5 除后余 3 的数字:a[i]%5==3
- 第二:数字的平均数(先求和,再除去被 5 除后余 3 的数字个数)
个数用num4来表示。平均数等于a4/num4。
if(a[i]%5==3){
a4=a4+a[i];
num4=num4+1;
}
- 第三:精确到小数点后 1 位,printf("%.1f ",a4/num4)
因为有小数,所以定义 a4,num4=0,为小数double。
double a4,num4=0;
if(a[i]%5==3){
a4=a4+a[i];
num4=num4+1;
}
printf("%.1f ",a4/num4);
6、A5的要求:被 5 除后余 4 的数字中最大数字。
有两个判断要求:
- 第一:被 5 除后余 4 的数字,a[i]%5==4
- 第二:数字中最大数字,定义一个变量temp,存储最新的数,
初始化a4=1,如果当前temp>a4,则a4==temp。没有则a4不变。
if(a[i]%5==4){
temp=a[i];
if(temp>a5){
a5=temp;
}
}
7、题目要求输出结果:
- 按题目要求计算 A1~A5并在一行中顺序输出。
printf("%d%d%d%d%d",a1,a2,a3,a4,a5)
- 数字间以空格分隔,但行末不得有多余空格。
printf("%d %d %d %d %d",a1,a2,a3,a4,a5)
- 若分类之后某一类不存在数字,则在相应位置输出 N。
在分类的时候给每个判断条件下加上一个变量num1、num2、num3、num4(目前已经有了)、num5;用于当前类别语句运行个数。
当num==0时输出N,否则根据题目要求输出结果。
a1输出语句
if(num1==0){
printf("N ");
}else{
printf("%d ",a1);
}
a2输出语句
if(num2==0){
printf("N ");
}else{
printf("%d ",a2);
}
a3输出语句
if(num3==0){
printf("N ");
}else{
printf("%d ",a3);
}
a4输出语句
if(num4==0){
printf("N ");
}else{
printf("%.1f ",a4/num4);
}
a5输出语句
if(num5==0){
printf("N");
}else{
printf("%d",a5);
}
8、碎碎念:
- 自己做完之后只得了11分,想不出来为啥了,后来看了答案是因为,没有给num变量们,初始化。
int num1=0,num2=0,num3=0,num4=0,num5=0;
- 觉得可以优化得地方:
1、我用得是变量a1,a2…;num1,num2…
可以改为象书上一样,用数组表示;
int a1=0,a2=0,a3=0,a5=0,temp=0;
int num1=0,num2=0,num3=0,num5=0;
对比
int count[5]={0};
int ans[5]={0};
2、我用的是数组a[i]去存储数据,
书上:其实不用,存储数据,后面也用不到,输入一个字母,判断一个字母。
int n,a[1010];
for (int i=0;i<n;i++){
scanf("%d",&a[i]);
}
for (int i=0;i<n;i++){
if()
...
}
对比
for (int i=0;i<n;i++){
scanf("%d",&temp);
if()
...
}
3、我单独给a4变量定义为double;
书上:其实不用,直接输出的时候在前面加个double。
double a4,num4=0;
printf("%.1f ",a4/num4);
对比
printf("%.1f ",(double)ans[3] /count[3]);
代码如下
1、我自己写的
#include<stdio.h>
int main(){
int n,a[1010];
scanf("%d",&n);
for (int i=0;i<n;i++){
scanf("%d",&a[i]);
}
int a1=0,a2=0,a3=0,a5=0,temp=0;
double a4,num4=0;
int num1=0,num2=0,num3=0,num5=0;
int mn=1,x=-1;
for (int i=0;i<n;i++){
if(a[i]%5==0&&a[i]%2==0){
a1=a1+a[i];
num1=num1+1;
}else if(a[i]%5==1){
a2=a2+mn*a[i];
mn=mn*x;
num2=num2+1;
}else if(a[i]%5==2){
a3=a3+1;
num3=num3+1;
}else if(a[i]%5==3){
a4=a4+a[i];
num4=num4+1;
}else if(a[i]%5==4){
temp=a[i];
if(temp>a5){
a5=temp;
}
num5=num5+1;
}
}
if(num1==0){
printf("N ");
}else{
printf("%d ",a1);
}
if(num2==0){
printf("N ");
}else{
printf("%d ",a2);
}
if(num3==0){
printf("N ");
}else{
printf("%d ",a3);
}
if(num4==0){
printf("N ");
}else{
printf("%.1f ",a4/num4);
}
if(num5==0){
printf("N");
}else{
printf("%d",a5);
}
return 0;
}
2、算法笔记答案:
#include<stdio.h>
int main(){
int count[5]={0};
int ans[5]={0};
int n,temp;
scanf("%d",&n);
for (int i=0;i<n;i++){
scanf("%d",&temp);
if(temp%5==0){
if(temp%2==0){
ans[0]+=temp;
count[0]++;
}
}else if(temp%5==1){
if(count[1]%2==0){
ans[1]+=temp;
}else{
ans[1]-=temp;
}
count[1]++;
}else if(temp%5==2){
count[2]++;
}else if(temp%5==3){
ans[3]+=temp;
count[3]++;
}else{
if(temp>ans[4]){
ans[4]=temp;
}
count[4]++;
}
}
if(count[0]==0) printf("N ");
else printf("%d ",ans[0]);
if(count[1]==0) printf("N ");
else printf("%d ",ans[1]);
if(count[2]==0) printf("N ");
else printf("%d ",count[2]);
if(count[3]==0) printf("N ");
else printf("%.1f ",(double)ans[3] /count[3]);
if(count[4]==0) printf("N");
else printf("%d",ans[4]);
return 0;
}