C语言PAT刷题 - 1012 数字分类

作者的话:若有朋友复制代码去PAT试着运行遇到问题的:
1.可能是格式问题,可以先把从本站复制的代码粘贴到记事本,再把记事本里的代码复制,然后粘贴到PAT的代码区,提交本题回答,应该就可以了;
2.可能是注释原因,PAT有时候检测到注释会编译错误,所以可以先把注释删了,再进行提交回答。
3.可能是作者当初根据题目写出来的代码仍存在一些疏漏,而恰好当时的测试机制没那么完善,没检测出问题。后面测试机制有所更新,故出现问题,若有相关需要的可以评论区留言或私信作者,我看到的话会去再查一下疏漏之处,然后更新文章。

一、题目描述
给定一系列正整数,请按要求对数字进行分类,并输出以下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。
输入样例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

二、解题思路
读题:

从键盘输入正整数N(待检测的正整数的数量),再输入N个正整数。要求程序能对这N个数字进行分类,根据给出的条件计算出A1,A2,A3,A4,A5的值并输出,若分类之后某一类不存在数字,则在相应位置输出N。
思路:
1.定义需要的变量(实际解题时是先定义认为需要用到的变量,后面遇到问题需要新定义变量时再回到上头来定义新的变量),接收整数N;
2.设置循环,每一轮循环对一个数字进行接收与分类,并根据条件需要进行相应的处理;
3.使用分支语句switch…case语句让每个数字除以5,根据结果分类,并进行不同的处理;
4.设置条件判断语句根据不同情况执行相应的输出。

三、具体实现
0.标准C源程序框架

#include <stdio.h>
#include <math.h>//本题中要用到乘方函数pow(),需要引用其所在的头文件<math.h>
int main()
{
	return 0;
}

1.定义需要的变量(实际解题时是先定义认为需要用到的变量,后面遇到问题需要新定义变量时再回到上头来定义新的变量),接收整数N;

	int n = 0;//定义变量,用于接收正整数N(待分类的数据的数量)
	int arr[1000] = { 0 };//测试用例会给出不超过一千的N,所以设置数组arr并分配1000个元素用于存储待分类的数据
	int i = 0;//循环变量,用于控制循环去接收数据以及做相应的处理
	int a[5] = {0};//储存A1,A2,A3,A4,A5的值
	int count[5] = {0};//统计不同类别的数据的个数,当其为0时,输出“N”
	scanf("%d",&n);

2.设置循环,每一轮循环对一个数字进行接收与分类,并根据条件需要进行相应的处理;

	for (i=0;i<n;i++)
	{
		scanf("%d",&arr[i]);
		//对数字进行分类,并根据条件需要进行相应的处理;
	}

3.使用分支语句switch…case语句让每个数字除以5,根据结果分类,并进行不同的处理;

		switch (arr[i]%5)
		{
		case 0:
		{
			if (arr[i] % 2 == 0)//A1=能被5整除的数字中所有偶数的和;(数组下标表示当前数字除以5后的余数)
			{
				a[0] += arr[i];
				count[0]++;
			}
			break;
		}
		case 1://A2=将被5除后余1的数字按给出顺序进行交错求和,即计算 n1−n2+n3−n4⋯;
		{
			a[1] += (int)(arr[i]*pow(-1,count[1]));
			count[1]++;
			break;
		}
		case 2://A3=被5除后余2的数字的个数;
		{
			a[2]++;
			count[2]++;
			break;
		}
		case 3://A4=被5除后余3的数字的平均数,精确到小数点后1位;
		{
			a[3] += arr[i];
			count[3]++;
			break;
		}
		case 4://A5=被5除后余4的数字中最大数字。
		{
			if (a[4] < arr[i])
			{
				a[4] = arr[i];
			}
			count[4]++;
			break;
		}
		}

4.设置条件判断语句根据不同情况执行相应的输出。

	for (i = 0; i < 5; i++)
	{
		if (count[i] == 0)
			printf("N");//当当前类别中没有数字时,输出“N”
		else if (i==3)
		{
			printf("%.1lf",((double)(a[3]))/count[3]);//计算余数为3的类别的的平均值并保留一位小数以double格式进行输出
		}
		else
		{
			printf("%d", a[i]);
		}
		if (i < 4)
		{
			printf(" ");//最后一位数字后面没有空格
		}
	}

四、全部代码

#include <stdio.h>
#include <math.h>
int main()
{
	int n = 0;//定义变量,用于接收正整数N(待分类的数据的数量)
	int arr[1000] = { 0 };//测试用例会给出不超过一千的N,所以设置数组arr并分配1000个元素用于存储待分类的数据
	int i = 0;//循环变量,用于控制循环去接收数据以及做相应的处理
	int a[5] = {0};//储存A1,A2,A3,A4,A5的值
	int count[5] = {0};//统计不同类别的数据的个数,当其为0时,输出“N”
	scanf("%d",&n);
	for (i=0;i<n;i++)
	{
		scanf("%d",&arr[i]);
		switch (arr[i]%5)
		{
		case 0:
		{
			if (arr[i] % 2 == 0)//A1=能被5整除的数字中所有偶数的和;(数组下标表示当前数字除以5后的余数)
			{
				a[0] += arr[i];
				count[0]++;
			}
			break;
		}
		case 1://A2=将被5除后余1的数字按给出顺序进行交错求和,即计算 n1−n2+n3−n4⋯;
		{
			a[1] += (int)(arr[i]*pow(-1,count[1]));
			count[1]++;
			break;
		}
		case 2://A3=被5除后余2的数字的个数;
		{
			a[2]++;
			count[2]++;
			break;
		}
		case 3://A4=被5除后余3的数字的平均数,精确到小数点后1位;
		{
			a[3] += arr[i];
			count[3]++;
			break;
		}
		case 4://A5=被5除后余4的数字中最大数字。
		{
			if (a[4] < arr[i])
			{
				a[4] = arr[i];
			}
			count[4]++;
			break;
		}
		}
	}
	for (i = 0; i < 5; i++)
	{
		if (count[i] == 0)
			printf("N");//当当前类别中没有数字时,输出“N”
		else if (i==3)
		{
			printf("%.1lf",((double)(a[3]))/count[3]);//计算余数为3的类别的的平均值并保留一位小数以double格式进行输出
		}
		else
		{
			printf("%d", a[i]);
		}
		if (i < 4)
		{
			printf(" ");//最后一位数字后面没有空格
		}
	}
	return 0;
}
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值