注册 登录
编程论坛 C语言论坛

不知到各位有没有简便方法 数字分类 (20分)

Knightl8 发布于 2020-03-10 10:56, 1836 次点击
只有本站会员才能查看附件,请 登录

输入样例 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
这是我的,希望各位有没有其他简便的方法
程序代码:
#include <stdio.h>
#include <stdlib.h>
#define MAX 1000

int main(void)
{
    int num[MAX];
    float n[5] = {0};
    int count = 0, sum = 0,flag=0;
    int m, max = 0, sign = 1;
    scanf("%d", &m);
    for (int i = 0; i < m; i++)
    {
        scanf("%d", &num[i]);

        if (num[i] % 5 == 0 && num[i] % 2 == 0)
        {
            n[0] += num[i];
        }
        if (num[i] % 5 == 1)
        {
            flag=1;
            n[1] += sign * num[i];
            sign *= -1;
        }
        if (num[i] % 5 == 2)
        {
            n[2]++;
        }
        if (num[i] % 5 == 3)
        {
            count++;
            sum += num[i];
        }
        if (num[i] % 5 == 4)
        {
            if (num[i] > max)
            {
                max = num[i];
                n[4] = max;
            }
        }
    }
    if(count!=0)
    n[3] = 1.0 * sum / count;
    for (int i = 0; i < 5; i++)
    {
        if (n[i] != 0&& i!=1)
        {
            if (i == 3)
                printf("%.1f", n[i]);
            else
            {
                printf("%.0f", n[i]);
            }
        }
        else if(i==1&&flag!=0)
        {
            printf("%.0f",n[i]);
        }
        else
        {
            printf("%c",'N');
        }
        
        

        if (i < 4)
        {
            printf(" ");
        }
        else
        {
            printf("");
        }
    }

    system("pause");
    return 0;
}

8 回复
#2
return_02020-03-10 11:00

水。。。
#3
return_02020-03-10 11:01
能用switch应该简便一些
#4
return_02020-03-10 11:06
a1您能化简,因为他其实指的是能被10整除的数
#5
return_02020-03-10 11:17
a2使用flag变量应该这样用:
flag=1-flag
巧不巧?
1转0
0转1
#6
xianfajushi2020-03-10 11:31
1如果对输入的一个数当即处理,就不需要数组scanf("%d", &num[i]);只需要一个变量即可
2多次运算确实啰嗦且效率低,用一个变量获取运算的值,依据值选择执行即可。为此修改一下:int aa=0;循环中修改:scanf("%d", &aa),aa%=5;
3使用选择语句即可if(aa==0)else if(aa==1)...else这样就可以了。
4float n[5]的下标也就是aa的值if(aa==0)n[aa]=
#7
wmf20142020-03-10 11:39
直接上代码,尽量综合有共性的部分。
用if和用switch看个人喜好,结果都一样。
程序代码:
#include<stdio.h>
int main()
{
    int i,j,f=1,m,n,a[5][2]={0};
    scanf("%d",&n);
    while(n--)
    {
        scanf("%d",&m);
        j=m%5;
        if(j>0||!(m%10))a[j][1]++;
        if(!(m%10)||j==3)a[j][0]+=m;
        if(j==1)
        {
            a[j][0]+=(m*f);
            f*=-1;
        }
        if(j==2)a[j][0]=a[j][1];
        if(j==4&&m>a[j][0])a[j][0]=m;
    }
    for(i=0;i<5;i++)
    {
        if(i)printf(" ");
        if(!a[i][1])printf("N");
        else if(i==3)printf("%.1f",(float)a[i][0]/a[i][1]);
        else printf("%d",a[i][0]);
    }
    printf("\n");
    return 0;
}   
#8
xianfajushi2020-03-10 13:02
使用if(aa==0)else if(aa==1)...else可以提高效率跳过不必要的判断运算。
#9
forever742020-03-10 14:05
我来装一回。
程序代码:

#include <stdio.h>
void A1(int x)
{
        static sum=0;
        if(x)
        {        if(x%2==0)sum+=x;}
        else
                printf(sum?"%d ":"N ",sum);
}
void A2(int x)
{
        static sum=0,s=-1,count=0;
        if(x)
        {      
                count++;
                s*=-1;
                sum+=s*x;
        }
        else
                printf(count?"%d ":"N ",sum);
}
void A3(int x)
{
        static count=0;
        if(x) count++;
        else printf(count?"%d ":"N ",count);
}
void A4(int x)
{
        static sum=0,count=0;
        if(x)
        {
                sum+=x;
                count++;
        }
        else
                printf(count?"%.1f ":"N ",(double)sum/count);
}
void A5(int x)
{
        static max=0;
        if(x)
        {       if(x>max)max=x;}
        else
                printf(max?"%d\n":"N\n",max);
}
int main()
{
        void (*A[5])(int)={A1,A2,A3,A4,A5};
        int N,x;
        scanf("%d",&N);
        while(N--)
        {
                scanf("%d",&x);
                A[x%5](x);
        }
        for(x=0;x<5;x++)
                A[x](0);
        return 0;
}
1