给定 N 个正整数,要求你从中得到下列三种计算结果:
- A1 = 能被 3 整除的最大整数
- A2 = 存在整数 K 使之可以表示为 3K+1 的整数的个数
- A3 = 存在整数 K 使之可以表示为 3K+2 的所有整数的平均值(精确到小数点后 1 位)
输入格式:
输入首先在第一行给出一个正整数 N,随后一行给出 N 个正整数。所有数字都不超过 100,同行数字以空格分隔。
输出格式:
在一行中顺序输出 A1、A2、A3的值,其间以 1 个空格分隔。如果某个数字不存在,则对应输出NONE
。
输入样例 1:
8
5 8 7 6 9 1 3 10
输出样例 1:
9 3 6.5
输入样例 2:
8
15 18 7 6 9 1 3 10
输出样例 2:
18 3 NONE
#include<stdio.h>
int main(void)
{
int n,c=0,A1=0,A2=0;
int a[200]={0};
double A3=0;
scanf("%d",&n);
for(int i=0;i<n;i++){
scanf("%d",&a[i]);
}
for(int i=0;i<n-1;i++)
{
for(int j=0;j<n-i-1;j++)
{
if(a[j+1]<a[j])
{
int t=a[j+1];
a[j+1]=a[j];
a[j]=t;
}
}
}
//排序以让找A1时从大到小,更快
for(int i=n-1;i>=0;i--)
{
if(a[i]%3==0)
{
A1=a[i];
break;
}
}
for(int i=0;i<n;i++)
{
if(a[i]%3==1)
{
A2++;
}
if(a[i]%3==2)
{
A3+=a[i];
c++;
}
}
if(A1!=0)
{
printf("%d ",A1);
}
else printf("NONE ");
if(A2!=0)
{
printf("%d ",A2);
}
else printf("NONE ");
A3/=c;
if(c!=0)
{
printf("%.1lf",A3);
}
else printf("NONE");
}
需要注意的是这里有几个易错点:
1.初学者对冒泡排序不太熟练会将第二次循环的减少定为从前往后而不是从后向前即初始是a[0],变成a[1] 但这是错的因为我这里的冒泡是把最大的数冒泡到最后仅能确定最后的数是最大的,而最前面的数是不是最小的却未必
2. 题目要求是找到A1,他是最大的数,很有可能会将这一步忽略而忘记排序从大到小进行判断
3. 题目的A2,A3这个3k+1,3k+2使用求余%就可以进行判断,有部分人可能会忘记,所以用循环来判断,当然也可以但会很麻烦