📜  在N以下找到2和5的所有倍数的总和(1)

📅  最后修改于: 2023-12-03 15:07:54.438000             🧑  作者: Mango

在N以下找到2和5的所有倍数的总和

本程序旨在找到在给定正整数N以下,所有2和5的倍数的总和。我们将介绍两种不同的解决方案。

方案一:暴力搜索

首先,我们可以使用暴力搜索来解决这个问题。具体步骤如下:

  1. 初始化总和为0
  2. 遍历1到N,依次检查每个数字是否是2或5的倍数
  3. 如果是2或5的倍数,将其加入总和中
  4. 返回总和值

下面是具体的Python代码实现:

def sum_of_multiples_v1(n):
    total_sum = 0
    for i in range(1, n+1):
        if i % 2 == 0 or i % 5 == 0:
            total_sum += i
    return total_sum
方案二:优化性能

上述实现的时间复杂度是O(N)。那么我们有没有更加高效的解决方案呢?答案是有的。我们可以使用数学方法来优化性能。

我们可以发现,在N以下,2的倍数出现的次数为N/2,5的倍数出现的次数为N/5。但是,我们需要注意的是,有些数字可能既是2的倍数,也是5的倍数。因此,我们需要减去重复计入的数字。这些数字是同时是2和5的倍数的数字,它们出现的次数为N/lcm(2, 5),其中lcm(2, 5)表示2和5的最小公倍数。

该思路的具体步骤如下:

  1. 初始化总和为0
  2. 分别计算2和5的倍数出现的次数
  3. 减去同时是2和5的倍数的数字的总次数
  4. 计算总和并返回

下面是具体的Python代码实现:

import math

def sum_of_multiples_v2(n):
    multiples_of_2 = n // 2
    multiples_of_5 = n // 5
    multiples_of_10 = n // 10
    lcm = 2 * 5 // math.gcd(2, 5)
    multiples_of_lcm = n // lcm
    total_sum = 2 * multiples_of_2 + 5 * multiples_of_5 - 10 * multiples_of_10 - lcm * multiples_of_lcm
    return total_sum
总结

我们介绍了两种解决方案,一种是暴力搜索,另一种是优化性能。在解决问题时,我们应该根据具体情况选择合适的方法。