关于算法:如何在Python中找到低于1000的3或5的所有倍数的总和?

How to find the sum of all the multiples of 3 or 5 below 1000 in Python?

不确定我是否应该把这个贴在math.stackexchange上,但是它包含了更多的编程,所以我把它贴在这里。

这个问题似乎很简单,但我已经在这里坐了至少一个小时,现在还没弄明白。我尝试过不同的解决方案,读过它的数学公式等等,但在编码时它不能给我正确的答案!我为它做了两个不同的解决方案,这两个都给了我错误的答案。第一个解决方案给我265334,第二个解决方案给我232169。答案是233168,所以第二个解决方案更接近。

我应该提到这是欧拉项目的一个问题,这是第一个准确的问题。

这是我的密码。有什么问题吗?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
nums = [3, 5]
max = 999

result = 0
for num in nums:
    for i in range(1,max):
        if num*i < max:
            result += num*i
print result


result = 0
for i in range(0,max):
    if i%3 == 0 or i%5 == 0:
        result += i

print result


你太复杂了。您只需要一个3或5的倍数的数字列表,您可以通过列表理解轻松获得:

1
>>> [i for i in range(1000) if i % 3 == 0 or i % 5 == 0]

然后用sum得到:

1
2
>>> sum([i for i in range(1000) if i % 3 == 0 or i % 5 == 0])
<<< 233168

或者更好地使用生成器表达式:

1
>>> sum(i for i in range(1000) if i % 3 == 0 or i % 5 == 0)

或者更好(尊敬的埃克西安):

1
>>> sum(set(list(range(0, 1000, 3)) + list(range(0, 1000, 5))))


range(k,max)不包括max,所以您实际上检查并包括998(而999是3的倍数)。用range(1,1000)代替。


第一个解决方案的问题是它将15的倍数加倍(因为它们是3和5的倍数)。

第二个解决方案的问题是它不计算999(3的倍数)。只需设置EDOCX1[4]来修复此问题。


我最喜欢这个:

1
2
3
4
def divisibles(below, *divisors):
    return (n for n in xrange(below) if 0 in (n % d for d in divisors))

print sum(divisibles(1000, 3, 5))


结果=0

对于范围(01000)内的i:

1
2
3
4
5
if (i % 3 == 0 or i % 5 == 0):

    print i

    result = result + i

打印结果

...

九百九十三

九百九十五

九百九十六

九百九十九

二十三万三千一百六十八


1
2
3
4
5
6
7
8
t = int(input())
for a in range(t):
n = int(input().strip())
sum=0
for i in range(0,n):
       if i%3==0 or i%5==0:
            sum=sum+i
print(sum)


我认为代码的最后几行才是重要的。OR语句是此代码中的关键语句。也比将最大值设置为999更重要,您应该将其设置为1000,这样它将覆盖所有值。这是我的密码。

1
2
3
4
5
6
    ans=0
    for i in range(1,1000):
        if(i%3==0 or i%5==0):
            ans += i
    print(ans)
    input('press enter key to continue');#this line is only so that the screen stays until you press a key


1
2
3
4
5
6
7
max = 1000  # notice this here
result = 0
for i in range(0,max):
if i%3 == 0 or i%5 == 0:
    result += i

print result

这是可行的,但使用1000作为最大值,所以它也包括999。


我知道这是6年前的事了,但我想我可以分享一个我认为有趣的数学公式的解决方案,因为它消除了循环遍历所有数字的必要性。

https://math.stackexchange.com/a/9305

1
2
3
4
5
6
7
8
9
def sum_of_two_multiples(nums, maxN):
   "takes tuple returns multiples under maxN (max number - 1)"
    n1, n2 = nums = nums[:2]
    maxN -= 1
    def k(maxN, kx):
        n = int(maxN / kx)
        return int(kx * (0.5 * n * (n+1)))

return sum([k(maxN, n) for n in nums]) - k(maxN, n1*n2)

输出以下内容

1
2
3
4
5
6
print(sum_of_two_multiples((3,5), 10))
# 23
print(sum_of_two_multiples((3,5), 1000))
# 233168
print(sum_of_two_multiples((3,5), 10**12))
# 233333333333166658682880


楼层(999/3)是3的倍数,楼层(999/5)是5的倍数,楼层(999/15)是1000下15的倍数。

对于3,这些是:3+6+9+12+…+999=3*(1+2+3+4+…+333)

=3*(333*334/2),因为从1到k的整数之和是k*(k+1)/2。

对5和15的倍数之和使用相同的逻辑。这给出了一个恒定的时间解。对任意输入进行归纳。


我知道这是3个月前的事了,但作为一个实验,因为我对python不熟悉,所以我决定尝试合并其他人的一些答案,我想出了一个方法,可以将max数传递给,除数作为一个列表,它返回和:

1
2
3
4
5
6
7
def sum_of_divisors(below, divisors):
    return sum((n for n in xrange(below) if 0 in (n % d for d in divisors)))

max = 1000
nums = [3, 5]

print sum_of_divisors(max, nums)


这是我的解决方案:

1
2
3
4
5
6
7
8
9
10
11
12
13
for n in range(100):
    if n % 5==0:
        if n % 3==0:
        print n,"Multiple of both 3 and 5"    #if the number is a multiple of 5, is it a multiple of 3? if yes it has has both.

    elif n % 5==0:
        print n,"Multiple of 5"

    elif n % 3==0:
        print n,"Multiple of 3"

    else:
        print n "No multiples"


干得好:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
count = 1000
m = [3, 5, 3*5]
result = 0
Sum = 0
for j in m:
    result = 0
    for i in range(count):
        if i*j < 1000:
            result = result + i*j
        elif i == (count - 1):
            if j < 15:
                Sum = result + Sum
            elif j == 15:
                Sum = Sum - result
                print Sum


我必须在1100范围内完成

我就是这样做的。

1
2
3
4
5
For i in range(1,100):

If i ÷ 3 == 0 and i ÷ 5 == 0:

 print(i)

所以有了1000你只需把100换成1000

我必须在100内找到3和5的倍数,所以如果你需要3或5,只需将它改为或,它也会给你更多的答案。我刚开始学习,如果我错了就纠正我。


这是我的解决方案

1
2
3
4
5
sum = 0
for i in range (1,1000):
        if (i%3)==0 or (i%5)==0:
            sum = sum + i
print(sum)


1
2
3
4
5
6
7
count = 0

for i in range(0,1000):
    if i % 3 == 0 or i % 5 ==0:
        count = count + i

print(count)


我知道那是7年前的事了,但我想分享我解决这个问题的方法。

1
2
3
4
5
6
7
8
9
10
x= set()
for i in range(1,1001):
    if (i % 3) == 0:
        x.add(i)

for j in range(1,1001):
    if (j % 5) == 0:
        x.add(j)

print(sum(x))


您还可以使用函数式编程工具(过滤器):

1
2
3
4
def f(x):
    return x % 3 == 0 or x % 5 == 0
    filter(f, range(1,1000))
print(x)

或者使用两个减法为15的列表(出现在两个列表中):

1
2
3
4
5
6
7
8
sum1 = []
for i in range(0,1000,3):
    sum1.append(i)
sum2 = []
for n in range(0,1000,5):
    sum2.append(n)
del sum2[::3] #delete every 3-rd element in list
print(sum((sum1)+(sum2)))

我喜欢这个解决方案,但我想它需要一些改进…