数字分类 (20)
数字分类 (20)
时间限制 1000 ms 内存限制 32768 KB 代码长度限制 100 KB
题目描述
给定一系列正整数,请按要求对数字进行分类,并输出以下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、强制转换类型
v1版编码时 余数为3时,平均数总不对。后来发现是除数被除数都是int型,结果不是浮点型而是自动识别为int型。所以需要强制转换下,或者设置sum变量时直接设为浮点型,此时除数和被除数有一个为浮点型,计算时即可按照浮点型运算。
2、break
switch-case语句,break表示跳至switch有括号处。若没有break则继续执行下一个case语句。
v1版↓
#include<stdio.h> int main(){ int num,a,a1=0,a2=0,a3=0,a5=0,n,i,b=1,sum=0,co3=0; float a4=0; bool s0=false,s1=false,s2=false,s3=false,s4=false; scanf("%d",&n); for(i=0;i<n;i++){ scanf("%d",&num); a=num%5; switch(a) { case 0:{ if(num%2==0){ s0=true; a1=a1+num; break; } break; } case 1:{ s1=true; a2=a2+b*num; b=-b; break; } case 2:{ s2=true; a3++; break; } case 3:{ s3=true; sum=sum+num; co3++; a4=(float)sum/co3; break; } case 4:if(num>a5){ s4=true; a5=num; break; } } } if(s0) printf("%d",a1); else printf("N"); if(s1) printf(" %d",a2); else printf(" N"); if(s2) printf(" %d",a3); else printf(" N"); if(s3) printf(" %.1f",a4); else printf(" N"); if(s4) printf(" %d",a5); else printf(" N"); return 0; }
v1代码思路清晰却有些拖沓,可优化,晚些来填坑。
……………………………………………………………………填坑分割线…………………………………………………………………………………………………………………………
v2版省略了v1中的状态判断变量,直接使用case中变量是否改变来判断是否存在该类数字。
同时省略了a变量,而直接用num%5替代a进行switch判断。
v1中的强制类型转换问题,将sum设为浮点型变量即可解决,因为在/运算中只要有一个运算数为float型,其他运算数若不是浮点型,自动转换成浮点型进行计算。
1 #include<stdio.h> 2 int main(){ 3 int num,a1=0,a2=0,a3=0,a5=0,n,i,b=1,co3=0; 4 float a4=0,sum=0; 5 6 scanf("%d",&n); 7 8 for(i=0;i<n;i++){ 9 scanf("%d",&num); 10 switch(num%5) 11 { 12 case 0:{ 13 if(num%2==0){ 14 a1=a1+num; 15 break; 16 } 17 break; 18 } 19 case 1:{ 20 a2=a2+b*num; 21 b=-b; 22 break; 23 } 24 case 2:{ 25 a3++; 26 break; 27 } 28 case 3:{ 29 sum=sum+num; 30 co3++; 31 a4=sum/co3; 32 break; 33 } 34 case 4:if(num>a5){ 35 a5=num; 36 break; 37 } 38 } 39 } 40 if(a1!=0) 41 printf("%d",a1); 42 else 43 printf("N"); 44 if(a2!=0) 45 printf(" %d",a2); 46 else 47 printf(" N"); 48 if(a3>0) 49 printf(" %d",a3); 50 else 51 printf(" N"); 52 if(a4!=0) 53 printf(" %.1f",a4); 54 else 55 printf(" N"); 56 if(a5>0) 57 printf(" %d",a5); 58 else 59 printf(" N"); 60 61 return 0; 62 }