初学者 - 尝试制作一个简单的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)
这将打印正在考虑的所有数字。我只需要将它们加在一起,这就是我的答案。
我想要发生两件事之一,而不是我写的代码:
答案 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