Problem 1 : Multiples of 3 and 5

Problem 1


Multiples of 3 and 5

If we list all the natural numbers below 10 that are multiples of 3 or 5, we get 3, 5, 6 and 9. The sum of these multiples is 23.

Find the sum of all the multiples of 3 or 5 below 1000.


3的倍数和5的倍数

如果我们列出10以内所有3或5的倍数,我们将得到3、5、6和9,这些数的和是23。

求1000以内所有3或5的倍数的和。


题目解答

    朴素解法:暴力枚举(需要考虑既能被3整除又能被5整除的数字只需要加一次,利用容斥原理可以解决这个问题)

    优化算法:

        我们我们通过图片可以观察出 3和5所有重叠的数字都是是3和5的最小公倍数的倍数,也就是15的倍数,所以我们只需要将3的倍数和与5的倍数和相加并减去15的倍数和即可。

           

    在这里我们完全不必暴力枚举,利用等差数列求和公式即可解决这个问题:

    等差数列求和公式推导:

                      

                    

                    

                      

    我们可以通过数学归纳法再次进行证明,这里就不多介绍了。

题目代码

#include <stdio.h>
#include <inttypes.h>
int32_t main() {
    int32_t sum_3 = (999 / 3) * (3 + (999/3) *3) / 2;
    int32_t sum_5 = (999 / 5) * (5 + (999/5) *5) / 2;
    int32_t sum_15 = (999 / 15) * (15 + (999 / 15) * 15) / 2;
    printf("%" PRId32 "\n",sum_3 + sum_5 - sum_15);
    return 0;
}

        

## Problem 5: Remainder Generator Like functions, generators can also be higher-order. For this problem, we will be writing `remainders_generator`, which yields a series of generator objects. `remainders_generator` takes in an integer `m`, and yields `m` different generators. The first generator is a generator of multiples of `m`, i.e. numbers where the remainder is 0. The second is a generator of natural numbers with remainder 1 when divided by `m`. The last generator yields natural numbers with remainder `m - 1` when divided by `m`. Note that different generators should not influence each other. > Hint: Consider defining an inner generator function. Each yielded generator varies only in that the elements of each generator have a particular remainder when divided by m. What does that tell you about the argument(s) that the inner function should take in? ```python def remainders_generator(m): """ Yields m generators. The ith yielded generator yields natural numbers whose remainder is i when divided by m. >>> import types >>> [isinstance(gen, types.GeneratorType) for gen in remainders_generator(5)] [True, True, True, True, True] >>> remainders_four = remainders_generator(4) >>> for i in range(4): ... print("First 3 natural numbers with remainder {0} when divided by 4:".format(i)) ... gen = next(remainders_four) ... for _ in range(3): ... print(next(gen)) First 3 natural numbers with remainder 0 when divided by 4: 4 8 12 First 3 natural numbers with remainder 1 when divided by 4: 1 5 9 First 3 natural numbers with remainder 2 when divided by 4: 2 6 10 First 3 natural numbers with remainder 3 when divided by 4: 3 7 11 """ "*** YOUR CODE HERE ***" ``` Note that if you have implemented this correctly, each of the generators yielded by `remainder_generator` will be infinite - you can keep calling next on them forever without running into a `StopIteration` exception.
最新发布
06-01
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值