0
点赞
收藏
分享

微信扫一扫

【入门3】循环结构 P5719 【深基4.例3】分类平均

千行 2022-01-06 阅读 26
分类c++

【深基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;
}
举报

相关推荐

0 条评论