题解:洛谷 P5719 【深基4.例3】分类平均
【题目来源】
【题目描述】
给定 \(n\) 和 \(k\),将从 $1 $ 到 \(n\) 之间的所有正整数可以分为两类:$A $ 类数可以被 \(k\) 整除(也就是说是 \(k\) 的倍数),而 $B $ 类数不能。请输出这两类数的平均数,精确到小数点后 $1 $ 位,用空格隔开。
数据保证两类数的个数都不会是 \(0\)。
【输入】
输入两个正整数 \(n\) 与 \(k\)。
【输出】
输出一行,两个实数,分别表示 \(A\) 类数与 \(B\) 类数的平均数。精确到小数点后一位。
【输入样例】
100 16
【输出样例】
56.0 50.1
【算法标签】
《洛谷 P5719 分类平均》 #模拟#
【代码详解】
#include <bits/stdc++.h> // 包含标准库头文件(万能头文件)
using namespace std; // 使用标准命名空间
/**
* 主函数 - 程序入口
* @return 程序执行状态码(0表示成功)
*/
int main()
{
int n, k; // 定义变量:n(数字范围上限), k(倍数判断条件)
int sum1 = 0, sum2 = 0; // 定义变量:sum1(k的倍数的和), sum2(非k倍数的和)
int c1 = 0, c2 = 0; // 定义变量:c1(k的倍数的个数), c2(非k倍数的个数)
double avg1, avg2; // 定义变量:avg1(k倍数的平均值), avg2(非k倍数的平均值)
cin >> n >> k; // 输入数字范围n和倍数k
// 遍历1到n的所有数字
for (int i = 1; i <= n; i++)
{
if (i % k == 0) // 判断是否为k的倍数
{
sum1 += i; // 累加到k倍数的和
c1++; // 计数k倍数的个数
}
else
{
sum2 += i; // 累加到非k倍数的和
c2++; // 计数非k倍数的个数
}
}
// 计算平均值(注意转换为浮点数计算)
avg1 = 1.0 * sum1 / c1; // k倍数的平均值
avg2 = 1.0 * sum2 / c2; // 非k倍数的平均值
// 输出结果(保留1位小数)
printf("%.1f %.1f", avg1, avg2);
return 0; // 程序正常结束
}
【运行结果】
100 16
56.0 50.1
浙公网安备 33010602011771号