Python 我的代码效率很低,是ProjectEuler的3倍和5倍,但超时时间为10秒
问题陈述Python 我的代码效率很低,是ProjectEuler的3倍和5倍,但超时时间为10秒,python,python-3.x,Python,Python 3.x,问题陈述 2 10 100 23 2318 13 26049952856435659498719093244723189200 23 2318 此问题是来自的问题1的编程版本 projecteuler.net 如果我们列出10以下的所有自然数,它们是3或3的倍数 5,我们得到3,5,6和9。这些倍数之和是23 求N以下所有3或5的倍数之和 输入格式 1≤T≤105 1≤N≤109 第一行包含表示测试用例数量的T。这是 后跟T行,每行包含一个整数N 输出格式 1≤T≤105 1≤N≤
2
10
100
23
2318
13
26049952856435659498719093244723189200
23
2318
此问题是来自的问题1的编程版本
projecteuler.net
如果我们列出10以下的所有自然数,它们是3或3的倍数
5,我们得到3,5,6和9。这些倍数之和是23
求N以下所有3或5的倍数之和
输入格式
1≤T≤105
1≤N≤109
第一行包含表示测试用例数量的T。这是
后跟T行,每行包含一个整数N
输出格式
1≤T≤105
1≤N≤109
对于每个测试用例,打印一个整数,表示所有测试用例的总和
N以下3或5的倍数
约束
1≤T≤105
1≤N≤109
样本输入
2
10
100
23
2318
13
26049952856435659498719093244723189200
23
2318
样本输出
2
10
100
23
2318
13
26049952856435659498719093244723189200
23
2318
我正在做第一个项目Euler问题,但有一个额外挑战的时间限制。如果该过程需要10秒以上,则会自动失败 以下是一个示例输入:
2 # number of test cases
10 # first test case
100 # second test case
这是我的密码:
test_case = int(input())
for x in range(0, test_case): # Loops after every test case
stop_value = int(input())
answer = 0
threes = 0
while threes < stop_value: # Checks 3s
answer += threes
threes += 3
fives = 0
while fives < stop_value: # Checks 5s
answer += fives
fives += 5
commons = 0
while commons < stop_value: # Check 15s
answer -= commons
commons += 15
print(answer)
您的输出(标准输出)
预期产出
2
10
100
23
2318
13
26049952856435659498719093244723189200
23
2318
这是自然数之和的推广。步长为
k
和最大数n
(其中n
可被k
整除)的一般公式为:n/k/2*(n+k)
虽然我完全同意您应该使用
poke
所述的自然数总和公式,但这仍然可以生成所有的数字。有关以分析方式解决问题的更多信息,请查看mathematics.SE中的问题
至于生成和求和所有数字,这是我能很快想到的最快的方法:
n=10**9; sum(xrange(0,n,3)) + sum(xrange(0,n,5)) - sum(xrange(0,n,15))
在我的i5上执行这一行大约需要5秒,但它消耗了大量内存请把问题放在问题中,即使是Euler,让我们去另一个站点帮助您也是不礼貌的。理解,抱歉,will Dot这是自然数之和之间的关系,和3或5的倍数之和。你不必把它们都算出来。而且,你不需要实际地加起来任何东西。把第一个数和最后一个数配对,然后把第二个数和下一个数配对,等等,它就变成了乘法。你为什么在这里用阶乘呢?那是错误的。你不需要一个循环来解决这个问题。@PeterWood,谢谢,这是一个很好的建议,现在这个解决方案是正确的,但是现在当n非常大时,表示这是错误的。我很确定这是由于涉及浮点运算时的舍入误差造成的。有办法解决吗?是的,你是对的。我通过改变乘法的顺序并使用整数除法来调整答案,使其始终保持整数(保持无限精度)。