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

时间:2011-05-08 20:51:27

标签: python algorithm

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

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

我应该提到这是Project Euler, the first one准确的问题。

这是我的代码。任何想法有什么不对?

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

19 个答案:

答案 0 :(得分:16)

你太复杂了。您只需要一个3或5的倍数的数字列表,您可以使用list comprehension轻松获得:

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

然后使用sum获取总数:

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

甚至更好地使用generator expression代替:

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

甚至更好更好(Exelian提供):

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

答案 1 :(得分:5)

range(k,max)不包含max,所以你真的要检查并包括998(而999是3的倍数)。请改用range(1,1000)

答案 2 :(得分:2)

你的第一个解决方案的问题是它会将15的倍数重复计算(因为它们是3和5的倍数)。

你的第二个解决方案的问题是它不计算999(3的倍数)。只需设置max = 1000即可解决此问题。

答案 3 :(得分:2)

我最喜欢这个:

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))

答案 4 :(得分:2)

result = 0

for i in range(0,1000):

if (i % 3 == 0 or i % 5 == 0):

    print i

    result = result + i

打印结果


0

3

5

6

9

。 。

993

995

996

999

233168

答案 5 :(得分:1)

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 :(得分:1)

我知道这是3个月前,但作为一个实验,因为我是python的新手,我决定尝试结合其他人的一些答案,我想出了一个方法,你可以将最大数量传递给除数,一个列表,它返回总和:

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)

答案 7 :(得分:1)

地板(999/3)的倍数为3,地板(999/5)的倍数为5,地板(999/15)的倍数为15的1000以下。

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

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

对5和15的倍数之和使用相同的逻辑。这给出了一个恒定的时间解决方案。将此概括为任意输入。

答案 8 :(得分:1)

我知道这是从6年前开始的,但我只是认为id共享一个解决方案,从我认为有趣的数学公式中找到,因为它消除了遍历所有数字的需要。

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

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)

输出以下内容

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

答案 9 :(得分:1)

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)

答案 10 :(得分:1)

我认为只有代码中的最后几行很重要。 or语句是此代码中的关键语句。 除了将最大值设置为999之外,还应将其设置为1000,以便覆盖所有值。 这是我的代码。

    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

答案 11 :(得分:0)

总计 = 0

maxrange = input("输入最大范围") #从键盘获取最大范围 打印("")

max = int(maxrange)

对于范围内的 i (0,max): 如果 i%3 == 0 或 i%5 ==0: 总计 = 总计 +i

打印(总计)

答案 12 :(得分:0)

我必须在1,100范围内做

这就是我的方法。

For i in range(1,100):

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

 print(i) 

因此,将1000更改为100即可

我必须在100内找到3和5的倍数,因此如果您需要3或5,只需将其更改为or,它也将为您提供更多答案。我刚刚开始学习,如果我错了,那就纠正我

答案 13 :(得分:0)

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

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))

答案 14 :(得分:0)

count = 0

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

print(count)

答案 15 :(得分:0)

这是我的解决方案

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

答案 16 :(得分:0)

这是我的解决方案:

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"

答案 17 :(得分:0)

你走了:

#include <iostream>
#include <thread>
#include <chrono>

bool stop = false;
int main(int argc, char *argv[])
{
    std::thread t([]{
        bool stop = false;
        std::string line;
        while (!stop && std::getline(std::cin, line, '\n')) {
            std::cout << line;
        }
    });

    std::this_thread::sleep_for(std::chrono::seconds(1));

    stop = true;
    // Without detach: g++: terminate called without an active exception
    t.detach();

    return 0;
}

答案 18 :(得分:0)

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

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

或者使用两个减去15的倍数的列表(出现在两个列表中):

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)))

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