week2-[循环结构]找出正数
题目描述
给定 NNN 个整数A1,A2,…,ANA_1,A_2,\ldots,A_NA1,A2,…,AN。请求出这 NNN 个数中有多少个数是正数,并求出这些正数的平均值。如果 A1,A2,…,ANA_1,A_2,\ldots,A_NA1,A2,…,AN 不存在正数,那么输出 “None”(输出时不需要输出引号)。
输入格式
读入包括 222 行。第一行只有 111 个整数 NNN,表示数的个数。第二行包括 NNN 个整数 A1,A2,…,ANA_1,A_2,\ldots,A_NA1,A2,…,AN。
输出格式
输出只有 111 行。如果 A1,A2,…,ANA_1,A_2,\ldots,A_NA1,A2,…,AN 不存在正数,那么输出 “None”(输出时不需要输出引号)。如果A1,A2,…,ANA_1,A_2,\ldots,A_NA1,A2,…,AN 存在至少一个正数,那么输出用恰好一个空格隔开的 222 个数,第一个数表示正数的个数,第二个数表示正数的平均值(正数的平均值四舍五入保留 333 位小数输出)。
样例 #1
样例输入 #1
5
-5 -3 0 -8 -100
样例输出 #1
None
样例 #2
样例输入 #2
6
5 -2 8 3 -4 1
样例输出 #2
4 4.250
样例 #3
样例输入 #3
5
1 2 3 4 5
样例输出 #3
5 3.000
提示
样例解释1
−5,−3,0,−8,−100-5,-3,0,-8,-100−5,−3,0,−8,−100 中不存在正数,根据题目要求输出 “None”。
样例解释2
5,−2,8,3,−4,15,-2,8,3,-4,15,−2,8,3,−4,1 中的正数为 5,8,3,15,8,3,15,8,3,1 这 444 个数,因此输出正数的个数 444 与正数的平均值 5+8+3+14=4.250\dfrac{5+8+3+1}{4}=4.25045+8+3+1=4.250。
样例解释3
1,2,3,4,51,2,3,4,51,2,3,4,5 中所有数都是正数,因此输出正数的个数 555 与正数的平均值 1+2+3+4+55=3.000\dfrac{1+2+3+4+5}{5}=3.00051+2+3+4+5=3.000。
数据范围
对于所有数据,1≤N≤100,−10000≤A,B≤100001 \le N \le 100, -10000 \le A,B \le 100001≤N≤100,−10000≤A,B≤10000。
1. 阅读题目
- 输入:
- 第 1 行:整数 NNN(表示有多少个数)。
- 第 2 行:NNN 个整数 A1,A2,…,ANA_1,A_2,\ldots,A_NA1,A2,…,AN。
- 输出:
- 如果没有正数 → 输出
"None"
。 - 如果有正数 → 输出两个数:
- 正数的个数
- 正数的平均值(四舍五入保留 3 位小数)
- 如果没有正数 → 输出
2. 分析问题
- 遍历所有 NNN 个数:
- 统计正数的数量
cnt
- 累加正数的和
sum
- 统计正数的数量
- 判断:
- 如果
cnt == 0
→ 输出"None"
- 否则 → 输出
cnt
和平均值 = sum / cnt
- 如果
- 平均值需要 四舍五入保留 3 位小数:
- 在 C++ 中可以用
cout << fixed << setprecision(3)
来处理。
- 在 C++ 中可以用
- 时间复杂度 O(N)O(N)O(N),空间复杂度 O(1)O(1)O(1)。
3. C++ 代码实现
#include <iostream>
#include <iomanip>
using namespace std;int main() {ios::sync_with_stdio(false);cin.tie(NULL);int N;cin >> N;int cnt = 0; // 正数个数long long sum = 0; // 正数和(防止溢出,虽然题目范围也不会溢出)for (int i = 0; i < N; i++) {int x;cin >> x;if (x > 0) {cnt++;sum += x;}}if (cnt == 0) {cout << "None\n";} else {double avg = (double)sum / cnt;cout << cnt << " " << fixed << setprecision(3) << avg << "\n";}return 0;
}
✅ 总结:
- 用循环统计 →
cnt
和sum
。 - 分支判断 → 有正数输出结果,没有输出
"None"
。 - 平均值格式化 →
fixed << setprecision(3)
保留 3 位小数。