【深基4.例3】分类平均
题目描述
给定 n(n≤10000) 和k(k≤100),将从 1 到 n 之间的所有正整数可以分为两类:A 类数可以被 k 整除(也就是说是 k 的倍数),而 B 类数不能。请输出这两类数的平均数,精确到小数点后 1 位,用空格隔开。
数据保证两类数的个数都不会是 0。
输入格式
无
输出格式
无
输入输出样例
输入 #1复制
100 16
输出 #1复制
56.0 50.1
寻找能被k整除的数字可以从1开始一个一个加到n穷举出所有一直判断能否整除这样寻找没问题,不过会比较浪费时间,还有一个比较好的处理方法就是直接从k开始枚举,枚举比起穷举要省时间,直接枚举k的倍数相加就行。
把k的倍数拿出来从1到n的数里找,找到后直加起来,而不是从1到n的数里找k的倍数。至于1到n里有几个k的倍数呢?这个可以循环里一个一个数或者直接n/k就是1到n个数中k的倍数的数量了。切记是n/k并不是找到的k的倍数之和sum/k。因为sum/k会出现冗余sum是数字和不是单个数字。至于剩下的数字就是非k的倍数之和了,那个怎么求?用等差数列求出所有数之和sum =(1+n)* n / 2然后减去k的倍数之和就能得到了。那么非k的倍数的数量怎么求?所有数的数量减去k的倍数的数量就能得到了。
输出格式是两个数中间有个空格,不是换行。
#include <iostream>
#include <iomanip>
using namespace std;
int main()
{
int n, k;
cin >> n >> k;
int sum1 = 0, sum2 = 0;
for (int i = k; i <= n; i += k)
sum1 += i;
sum2 = n * (1 + n) / 2 - sum1;
int count = n / k;
//不要忘记强制类型转换和留一位小数
cout << fixed << setprecision(1) << static_cast<double>(sum1) / count << " "
<< fixed << setprecision(1) << static_cast<double>(sum2) / (n - count) << endl;
return 0;
}