题目描述
给定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
编写思路
根据题目要求,我们需要从给定的N个正整数中计算出A1、A2、A3的值。
首先,我们可以遍历所有的正整数,找到能被3整除的最大整数。我们可以定义一个变量maxDivisibleBy3
来保存能被3整除的最大整数,初始值为0。然后,对于每个正整数num,如果num能被3整除且大于maxDivisibleBy3
,则更新maxDivisibleBy3
的值为num。遍历完所有的正整数后,maxDivisibleBy3
即为A1的值。
接下来,我们需要统计存在整数K使得3K+1的整数的个数,即A2的值。我们可以定义一个变量countMod1
来保存满足条件的整数个数,初始值为0。然后,对于每个正整数num,如果num减去1后除以3的余数为0,则将countMod1
的值加1。遍历完所有的正整数后,countMod1
即为A2的值。
最后,我们需要计算存在整数K使得3K+2的所有整数的平均值,即A3的值。我们可以定义两个变量sumMod2
和countMod2
,分别用于保存满足条件的整数之和和个数,初始值都为0。然后,对于每个正整数num,如果num减去2后除以3的余数为0,则将sumMod2
的值加上num,同时将countMod2
的值加1。遍历完所有的正整数后,A3的值可以通过sumMod2
除以countMod2
得到。
实现代码
#include <iostream>
#include <vector>
using namespace std;
int main() {
int N;
cin >> N;
vector<int> nums(N);
for (int i = 0; i < N; i++) {
cin >> nums[i];
}
int maxDivisibleBy3 = 0;
int countMod1 = 0;
int sumMod2 = 0;
int countMod2 = 0;
for (int i = 0; i < N; i++) {
int num = nums[i];
if (num % 3 == 0 && num > maxDivisibleBy3) {
maxDivisibleBy3 = num;
}
if ((num - 1) % 3 == 0) {
countMod1++;
}
if ((num - 2) % 3 == 0) {
sumMod2 += num;
countMod2++;
}
}
// 输出结果
cout << (maxDivisibleBy3 == 0 ? "NONE" : to_string(maxDivisibleBy3)) << " ";
cout << (countMod1 == 0 ? "NONE" : to_string(countMod1)) << " ";
cout << (countMod2 == 0 ? "NONE" : to_string((double)sumMod2 / countMod2)) << endl;
return 0;
}
对于给定的输入样例1,输出结果为”9 3 6.5″,符合预期结果。