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] |
然后用
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)))) |
。
第一个解决方案的问题是它将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))) |
我喜欢这个解决方案,但我想它需要一些改进…