问题描述
这是一个简单的代码,用于计算两个数字具有的公因子的数量。第一个代码如何不超过平局限制,而第二个代码如何超过时限。 第一
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开始。 “大多数情况下”它将比任何一个数字都小得多(除非a
被b
整除,反之亦然)。然后它仅重复sqrt(gcd)
次,最终迭代次数更少。对于同一对,GCD为100,因此循环将重复sqrt(100) == 10
次。十对七百。
即使在最坏的情况下,a
被b
整除,例如(300000,10000),您的 FIRST 解决方案也会迭代sqrt(10000) == 100
次,而您的 SECOND 将迭代10000次。
编辑:必须注意,GCD计算本身确实会占用几个CPU周期,但是实现方式将以较大的步数递归,并且对总时间的影响较小