week2-[循环结构]找出正数

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"
    • 如果有正数 → 输出两个数:
      1. 正数的个数
      2. 正数的平均值(四舍五入保留 3 位小数)

2. 分析问题

  • 遍历所有 NNN 个数:
    • 统计正数的数量 cnt
    • 累加正数的和 sum
  • 判断:
    • 如果 cnt == 0 → 输出 "None"
    • 否则 → 输出 cnt平均值 = sum / cnt
  • 平均值需要 四舍五入保留 3 位小数
    • 在 C++ 中可以用 cout << fixed << setprecision(3) 来处理。
  • 时间复杂度 O(N)O(N)O(N),空间复杂度 O(1)O(1)O(1)。

3. C++ 代码实现

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;
}

✅ 总结:

  • 用循环统计 → cntsum
  • 分支判断 → 有正数输出结果,没有输出 "None"
  • 平均值格式化 → fixed << setprecision(3) 保留 3 位小数。