不确定我是否应该在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
答案 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)))
我喜欢这个解决方案,但我想它需要一些改进...