作者的话:若有朋友复制代码去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;
}