为什么较长的代码没有超过时间限制,而较短的代码却没有超过时间限制?

问题描述

这是一个简单的代码,用于计算两个数字具有的公因子的数量。第一个代码如何不超过平局限制,而第二个代码如何超过时限。 第一

from math import sqrt
def gcd(a,b): 
      
    if a == 0: 
        return b 
    return gcd(b % a,a) 

def commDiv(a,b): 
      
    # find GCD of a,b 
    n = gcd(a,b) 
  
    # Count divisors of n 
    result = 0
    for i in range(1,int(sqrt(n))+1): 
  
        # if i is a factor of n 
        if n % i == 0: 
  
            # check if divisors are equal 
            if n/i == i: 
                result += 1
            else: 
                result += 2

    return result


if __name__ == "__main__":
        a,b = map(int,input().split())
        print(commDiv(a,b)) 
        

第二

a,input().split())
if a>b:
        small = b
        big = a
else:
        small = a
        big = b
c = 0
for i in range(1,small+1):
    if small%i == 0 and big%i == 0:
            c = c + 1
print(c)

解决方法

CPU周期数(执行速度)更多地取决于算法,而不是代码长度。

在这种情况下,您的 SECOND 解决方案具有一个循环,该循环重复small次。因此,假设(1200、700)对将重复700次。

您的第一解决方案从找到两个数字的GCD开始。 “大多数情况下”它将比任何一个数字都小得多(除非ab整除,反之亦然)。然后它仅重复sqrt(gcd)次,最终迭代次数更少。对于同一对,GCD为100,因此循环将重复sqrt(100) == 10次。十对七百。

即使在最坏的情况下,ab整除,例如(300000,10000),您的 FIRST 解决方案也会迭代sqrt(10000) == 100次,而您的 SECOND 将迭代10000次。

编辑:必须注意,GCD计算本身确实会占用几个CPU周期,但是实现方式将以较大的步数递归,并且对总时间的影响较小