不确定我是否应该把这个贴在math.stackexchange上,但是它包含了更多的编程,所以我把它贴在这里。
这个问题似乎很简单,但我已经在这里坐了至少一个小时,现在还没弄明白。我尝试过不同的解决方案,读过它的数学公式等等,但在编码时它不能给我正确的答案!我为它做了两个不同的解决方案,这两个都给了我错误的答案。第一个解决方案给我265334,第二个解决方案给我232169。答案是233168,所以第二个解决方案更接近。
我应该提到这是欧拉项目的一个问题,这是第一个准确的问题。
这是我的密码。有什么问题吗?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17nums = [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
你的答案之一是对的。
绝对不属于数学堆栈交换,这是一个(有点著名的)编程面试问题的变体,叫做fizz buzz。
我刚刚回答了一个类似的问题。代码在Java中,但应该很容易翻译成Python。
您的解决方案是O(n),这可以很容易地在O(1)时间内解决。
sum [3,6..999] + sum [5,10..999] - sum [15,30..999]。
来自项目欧拉:我们希望你喜欢解决这个问题。请不要通过在Project Euler之外发布您的解决方案来剥夺其他人进行相同过程的权利。如果您想分享您的见解,请转到讨论论坛的第1条。
你太复杂了。您只需要一个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))))
。
我对python不太熟悉,所以我甚至不知道你能这样做,但我还是不太明白。我会调查的,谢谢!
你应该列出理解是很好的。
在这种情况下,生成器表达式甚至更好:sum(i for i in xrange(1,1000) if (i%3 == 0) or (i%5 == 0)),那么就不必创建任何数组。并不是说你会注意到1000的差异,但有时创建一个巨大的伟大列表是值得避免的。
当然,非常好。
我敢说你还是把事情搞得太复杂了。试试这个:sum(set(range(0, 1000, 3) + range(0, 1000, 5)))。
@我的天哪!你是对的!
range(k,max)不包括max,所以您实际上检查并包括998(而999是3的倍数)。用range(1,1000)代替。
哦,天哪,这真让人难堪!我以前在1000岁的时候买过,但是我换了。哦,好吧,谢谢!:)
第一个解决方案的问题是它将15的倍数加倍(因为它们是3和5的倍数)。
第二个解决方案的问题是它不计算999(3的倍数)。只需设置EDOCX1[4]来修复此问题。
我最喜欢这个:
1
2
3
4def 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))
。
我很喜欢any(n % d == 0 for d in divisors),大概它的作品差不多一样,不过这纯粹是一种审美差异。
结果=0
对于范围(01000)内的i:
1
2
3
4
5if (i % 3 == 0 or i % 5 == 0):
print i
result = result + i
打印结果
零
三
五
六
九
...
九百九十三
九百九十五
九百九十六
九百九十九
二十三万三千一百六十八
1
2
3
4
5
6
7
8t = 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
6ans=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
7max = 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
9def 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
6print(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
7def 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
13for 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
15count = 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
5For i in range(1,100):
If i ÷ 3 == 0 and i ÷ 5 == 0:
print(i)
号
所以有了1000你只需把100换成1000
我必须在100内找到3和5的倍数,所以如果你需要3或5,只需将它改为或,它也会给你更多的答案。我刚开始学习,如果我错了就纠正我。
嗨,欢迎光临。这实际上不是原始问题的答案,它打印所有的数字,这些数字是3和5的倍数。问题是如何求和。-)
这是我的解决方案
1
2
3
4
5sum = 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
7count = 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
10x= 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
4def 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
8sum1 = []
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)))
我喜欢这个解决方案,但我想它需要一些改进…