检查数字 3^x * 5^y 的有效方法
Posted
技术标签:
【中文标题】检查数字 3^x * 5^y 的有效方法【英文标题】:Efficient way for checking number 3^x * 5^y 【发布时间】:2020-12-06 20:30:38 【问题描述】:我想检查基于下限和上限的数字是否只有 3 和 5 的素数除数,并且数字应该是 3 的幂和 5 的幂的乘积。我目前的解决方案是这个。我想优化它,因为在我看来,用 for 循环检查权力不是好方法。提前致谢。
def checkNum(x):
for i in range(1,50):
for j in range(1,50):
return x == (3**i) * (5**j)
def printResult(l, r):
for i in range(l,r):
if checkNum(i):
print(i)
基于 cmets 我认为这是最好的方法:
def checkNum(x):
while x%3==0:
x = x //3
while x%5==0:
x = x//5
return x==1
【问题讨论】:
你能想出一种方法来代替重复除法/取模吗?正常情况下你会如何手工解决问题? 只要数字能被 3 整除,就重复除以 3。只要数字能被 5 整除,就重复除以 5。你还剩下 1 吗? @FrankYellin 所以这就是你的意思? def checkNum(x): while x%3==0: x = x //3 while x%5==0: x = x//5 return x==1 @FrankYellin 这可能是一个更有效的循环,但它仍然是一个循环。 您对if i%3==0 and i%5==0:
的测试将排除一些x
或y
为零的候选人。以i=9
为例。
【参考方案1】:
我想优化它,因为用 for 循环检查权力并不好 在我看来。
在一系列随机数上,我们通过以下方式提高其速度:
def checkNum0(x):
if x % 2 == 0: # eliminate half the numbers in one test!
return False
while x % 15 == 0: # speed up the process
x = x // 15
while x % 5 == 0:
x = x // 5
while x % 3 == 0:
x = x // 3
return x == 1
或者我们可以使用嵌套循环并将两个部分合并为一个:
def checkNum(x):
if x % 2 == 0: # eliminate half the numbers in one test!
return False
for divisor in (15, 5, 3):
while (quotient_remainder := divmod(x, divisor))[1] == 0:
x = quotient_remainder[0]
return x == 1
【讨论】:
以上是关于检查数字 3^x * 5^y 的有效方法的主要内容,如果未能解决你的问题,请参考以下文章