Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/318.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 我的代码效率很低,是ProjectEuler的3倍和5倍,但超时时间为10秒_Python_Python 3.x - Fatal编程技术网

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非常大时,表示这是错误的。我很确定这是由于涉及浮点运算时的舍入误差造成的。有办法解决吗?是的,你是对的。我通过改变乘法的顺序并使用整数除法来调整答案,使其始终保持整数(保持无限精度)。