所有3或5的倍数的总和低于1000

时间:2014-12-01 21:54:07

标签: python

初学者 - 尝试制作一个简单的python程序来计算/回答这个问题:

  

如果我们列出10以下的所有自然数是3或5的倍数,我们得到3,5,6和9.这些倍数的总和是23。

  求出1000或以下所有3或5的倍数之和。

目前这就是我所拥有的:

a = 0
b = 0
while a < 1000:
    a = a + 3
    print (a)

while b < 1000
    b = b + 5
    print (b)

这将打印正在考虑的所有数字。我只需要将它们加在一起,这就是我的答案。

我想要发生两件事之一,而不是我写的代码:

  1. 我希望所有这些都在内部发生,因此不必使用“打印”功能。只打印所有这些倍数的总和。
  2. 我想要打印所有这些东西,但是我希望能够打印所有这些东西的总和。有没有办法让计算机获得它所印刷的所有东西的价值?

9 个答案:

答案 0 :(得分:7)

实际上这个问题可以在O(1)而不是O(N)中解决而不使用任何循环或列表:

所需的总和是3的所有倍数加上5的所有倍数的总和减去给定数字1000(LIMIT = 999)以下的(3 * 5 = 15)的倍数之和。总和计算为算术系列的总和。 它可以通过以下方式计算:

LIMIT=999

# Get the upper bounds for the arithmetic series
upper_for_three = LIMIT // 3
upper_for_five = LIMIT // 5
upper_for_fifteen = LIMIT // 15

# calculate sums
sum_three = 3*upper_for_three*(1 + upper_for_three) / 2
sum_five = 5*upper_for_five*(1 + upper_for_five) / 2
sum_fifteen = 15*upper_for_fifteen*(1 + upper_for_fifteen) / 2

# calculate total
total = sum_three + sum_five - sum_fifteen

# print result with Python 3
print(int(total))

结果是:

>>> 
233168

答案 1 :(得分:4)

可以使用生成器表达式在Python中的一行中执行此操作:

print(sum(x for x in range(1000) if x % 3 == 0 or x % 5 == 0))

range(1000)生成从0到999(包括0和999)的所有整数。对于每个整数,如果它可被3整除或可被5整除,则它将包含在结果中。 sum(...)函数将所有这些数字相加,最后print(...)打印结果。

答案 2 :(得分:1)

我会使用for循环来迭代所选range中的每个数字。然后你可以检查模数%是否等于0,这意味着它除以这些值时没有余数,如果是,则将它加到总数中。

total = 0
for num in range(1000):
    if num % 3 == 0 or num % 5 == 0:
        print(num)
        total += num

>>> total
233168

答案 3 :(得分:0)

虽然for循环可行,但您也可以使用生成器表达式和sum

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

答案 4 :(得分:0)

以下是适用于任何数字的另一种方式:

def multiples(number):
    sum = 0
    for x in range(number):
        if x % 3 ==0 or x % 5 == 0:
            sum += x
    return sum

答案 5 :(得分:0)

import java.util.*;

class Main{
    public static void main(String[] args){
        int start=1;
        int end=1000;

        int sum=0;
        for(int i=start;i<=end;i++){
            if(i%3==0 || i%5==0)
            sum+=i;
        }
        System.out.print(sum);
    }
}

答案 6 :(得分:0)

def sum_multiply (n):
    data = []
    for num in range (1, n):
        if num % 3 == 0 or num % 5 == 0:
            data.append(num)
    return sum(data)

sum_multiply(1000)

答案 7 :(得分:0)

此问题摘自ProjectEuler.net的问题#1。

如果您在网络上解决了问题,那么它将展示可有效计算解决方案的算法,而不是使用带有for循环的蛮力方法。

我强烈建议您尝试自己解决难题,当您在编码和重新编码后得到正确的答案时,这很有趣并且令人困惑:)。

此外,在HackerRank.com上有一个基于ProjectEuler.net挑战的竞赛,在很多情况下蛮力方法都失败了,因此如果您可以...杀死两只鸟,可以用石头杀死两只鸟。同时找到智能解决方案。

答案 8 :(得分:-2)

斯威夫特3:

func sumMultiples() -> Int {
    var result = 0
    for i in 1..<1000 {
        if i % 3 == 0 || i % 5 == 0 {
            result += i
        }
    }
    return result
}

print(sumMultiples())   // will print "233168"


// PS:
// you can calculate the result on paper, the idea is:
// how many numbers 3 is multiplier for? 999/3 = 333
// how many numbers 5 is multiplier for? 999/5 = 199
// sum of 333 numbers is ∑(from 1 to 333)*3 = ( (a1 + aN)*N/2 )*3 = ( (1 + 333)*333/2 )*3 = 166833
// sum of 199 numbers is ∑(from 1 to 199)*5 = ( (a1 + aN)*N/2 )*5 = ( (1 + 199)*199/2 )*5 = 99500
// but we count numbers for which and 3 and 5 are multipliers, so we need to decrement result
// decrement sum of 66 (999/15 = 66) numbers ∑(from 1 to 66)*15 = ( (a1 + aN)*N/2 )*15 = ( (1 + 66)*66/2 )*15 = 33165
// result = 166833 + 99500 - 33165 = 233168