遍历 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)会产生从1到n的整数。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 一次,时间复杂度
总结
分类统计题通常维护每一类的计数和总和。最后再统一计算平均值,能避免边遍历边处理格式的问题。