【深基4.例3】分类平均

GitHub跳转原题关系图返回列表

遍历 1 到 n,把 k 的倍数和非倍数分别累加计数,再格式化输出平均值。

OJ: luogu

题目 ID: P5719

难度:入门

标签:python入门循环数学

日期: 2026-07-15 18:22

题意

1..n 的正整数分成两类:能被 k 整除的数,和不能被 k 整除的数。输出两类数的平均值,保留 1 位小数。

思路

直接遍历 1..n。如果 x % k == 0,把它加入 A 类;否则加入 B 类。两类都分别维护“总和”和“数量”,最后计算平均值。

brute.py 不适合这题,因为逐个分类累加就是完整解法。

Python 知识

  • range(1, n + 1) 会产生从 1n 的整数。
  • x % k == 0 判断 x 是否是 k 的倍数。
  • 平均值是 sum / count
  • f"{value:.1f}" 控制输出小数点后 1 位。

对应的本地 Python 笔记:

  • /home/rainboy/mycode/hugo-blog/content/program_language/python/input_output_and_strings.md:整数输入和格式化输出。
  • /home/rainboy/mycode/hugo-blog/content/program_language/python/oj_input_output_cheatsheet.md:控制浮点小数位数。
  • /home/rainboy/mycode/hugo-blog/content/program_language/python/math_tools.md:取模和整数工具。

代码

python
n, k = map(int, input().split())

sum_a = count_a = 0
sum_b = count_b = 0

for x in range(1, n + 1):
    if x % k == 0:
        sum_a += x
        count_a += 1
    else:
        sum_b += x
        count_b += 1

print(f"{sum_a / count_a:.1f} {sum_b / count_b:.1f}", end="")
cpp
/**
 * Author by Rainboy blog: https://rainboylv.com github: https://github.com/rainboylvx
 * rbook: -> https://rbook.roj.ac.cn  https://rbook2.roj.ac.cn
 * rainboy的学习导航网站: https://idx.roj.ac.cn
 * create_at: 2026-07-27 00:00
 * update_at: 2026-07-27 00:00
 */

#include <bits/stdc++.h>
using namespace std;

int main() {
    int n, k; // 范围上限,分类除数
    cin >> n >> k;
    long long sum_a = 0, sum_b = 0; // 倍数的和、非倍数的和
    int cnt_a = 0, cnt_b = 0;       // 倍数的个数、非倍数的个数
    for (int x = 1; x <= n; x++) {
        if (x % k == 0) { // 是 k 的倍数
            sum_a += x;
            cnt_a++;
        } else {
            sum_b += x;
            cnt_b++;
        }
    }
    // 输出两类的平均值,保留 1 位小数
    printf("%.1f %.1f\n", (double)sum_a / cnt_a, (double)sum_b / cnt_b);
    return 0;
}

Pythonic 写法

列表推导分类:

python
n, k = map(int, input().split())
a = [i for i in range(1, n + 1) if i % k == 0]
b = [i for i in range(1, n + 1) if i % k]
print(f'{sum(a) / len(a):.1f} {sum(b) / len(b):.1f}')

复杂度

遍历 1..n 一次,时间复杂度 O(n)O(n),空间复杂度 O(1)O(1)

总结

分类统计题通常维护每一类的计数和总和。最后再统一计算平均值,能避免边遍历边处理格式的问题。