数字分类 (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 }

posted on 2017-04-13 00:25  AndKuang  阅读(583)  评论(0)    收藏  举报

导航