📅  最后修改于: 2023-12-03 14:57:33.433000             🧑  作者: Mango
在编程中,常常需要计算一定范围内没有特定数字的n个数字。例如,计算1到100中除了3和5的倍数以外所有数字之和。以下介绍几种解决方案。
暴力枚举是最简单的思路,即遍历每一个数字,判断是否为特定数字的倍数,如果不是则加入累加器中。
def sum_without_multiples(n, a, b):
sum = 0
for i in range(1, n+1):
if i % a != 0 and i % b != 0:
sum += i
return sum
其中,n表示范围,a和b分别表示特定数字。
容斥原理是一种常用的计数方法,用于计算多个集合的交集和并集。对于本题,可以利用容斥原理计算出包含特定数字的总和,再减去同时包含两个特定数字的总和,最后再加上同时包含三个特定数字的总和。
def sum_without_multiples(n, a, b):
sum = 0
sum_a = (n - 1) // a * (a + n - 1) // 2
sum_b = (n - 1) // b * (b + n - 1) // 2
sum_ab = (n - 1) // (a * b) * (a * b + n - 1) // 2
sum = n * (n + 1) // 2 - sum_a - sum_b + sum_ab
return sum
其中,n表示范围,a和b分别表示特定数字。注意要使用整除符号"//".
对于一定范围内没有特定数字的n个数字之和,也有数学公式可用。
def sum_without_multiples(n, a, b):
sum = 0
sum_a = (n - 1) // a * (a + n - 1) // 2
sum_b = (n - 1) // b * (b + n - 1) // 2
sum_ab = (n - 1) // (a * b) * (a * b + n - 1) // 2
sum = n * (n + 1) // 2 - sum_a - sum_b + sum_ab
return sum
其中,n表示范围,a和b分别表示特定数字。
以上便是三种解决方案,根据具体情况可选择不同方法。