检查数字是否是Python中的特洛伊木马数字
假设我们有一个数字n,我们必须检查n是否是Trojan Number。众所周知,特洛伊木马号是一个没有完善的幂的强数。当对于每个主除数或n的因子p,p ^ 2也是一个约数时,数字n是一个强数。换句话说,每个素因数至少出现两次。特洛伊木马数字很强。但是事实并非如此。因此,这意味着并非所有强数都是特洛伊木马数字:只有那些不能表示为a ^ b的数字。
因此,如果输入类似于72,则输出将为True,因为72可以表示为(6 * 6 * 2)=(6 ^ 2 * 2)。强数,但没有完美的力量。
为了解决这个问题,我们将遵循以下步骤-
定义一个函数check_perfect_pow()。这将花费n
如果n与1相同,则
返回True
对于范围2到(n的平方根)+ 1的整数部分的x,执行
如果p与n相同,则
y:= y + 1
p = x ^ y
返回True
y:= 2
p = x ^ y
当p <= n并且p> 0时,
返回False
定义一个函数check_span_num()。这将花费n
count:=一个保存数字频率的映射,最初都是0
而n mod 2与0相同,则
n:= n / 2(整数除法)
count [2]:= count [2] +1
对于范围在3到(n的平方根)+ 1的整数部分的i,增加2,
n:= n / i(整数除法)
count [i]:= count [i] + 1
当n mod我等于0时,
如果n> 2为非零,则
count [n]:= count [n] + 1
标志:= 0
对于每个键,
items()
计数值,执行标志:= 1
打破
如果值等于1,则
如果标志与1相同,则
返回False
返回True
从主要方法中执行以下操作-
当check_perfect_pow(n)为False并且check_span_num(n)为true时返回true,否则返回false
示例
让我们看下面的实现以更好地理解-
from math import sqrt, powdef check_perfect_pow(n):
if n == 1:
return True
for x in range(2, int(sqrt(n)) + 1):
y = 2
p = x**y
while p <= n and p > 0:
if p == n:
return True
y += 1
p = x**y
return False
def check_span_num(n):
count = {i:0 for i in range(n)}
while n % 2 == 0:
n = n // 2
count[2] += 1
for i in range(3,int(sqrt(n)) + 1, 2):
while n % i == 0:
n = n // i
count[i] += 1
if n > 2:
count[n] += 1
flag = 0
for key,value in count.items():
if value == 1:
flag = 1
break
if flag == 1:
return False
return True
def isTrojan(n):
return check_perfect_pow(n) == False and check_span_num(n)
n = 72
print(isTrojan(n))
输入值
72
输出结果
True
以上是 检查数字是否是Python中的特洛伊木马数字 的全部内容, 来源链接: utcz.com/z/331064.html