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

不确定我是否应该把这个贴在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)))

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值