【PAT 乙级】1012 数字分类

该篇文章介绍了如何根据数字除以5的余数进行分类,并计算被5整除的偶数和、余1数的交替和、余2数的数量、余3数的平均数以及余4数的最大值,使用C语言实现了一个解决方案。
摘要由CSDN通过智能技术生成

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、题目要求输出结果:

  1. 按题目要求计算 A1~A5并在一行中顺序输出。
printf("%d%d%d%d%d",a1,a2,a3,a4,a5)
  1. 数字间以空格分隔,但行末不得有多余空格。
printf("%d %d %d %d %d",a1,a2,a3,a4,a5)
  1. 若分类之后某一类不存在数字,则在相应位置输出 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;
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值