python3.8,jupyter notebook运行结果:
详细思路在代码中,主要思路为:
一,#情况这样考虑:如有8、72这两个数,则考虑 2^3 * 1^2,8*9 = 2*2*2*3*3
#如99,约数有3、3、11,保存在mm中得mm = [3,3,11],然后有个列表kk = [3,11],具体操作kk=list(set(mm))
#则说明mm.count[kk[0]] = mm.count[3]= 2,mm.count[kk[1]] = mm.count[11] = 1,
#此时只需要判断是否有两个不同的约数,或只有一个约数,且每个约数个数大于1
二,#这里种类为2和1都行,如8=2*2*2,其约数种类是1即只有2,但其显然可以2*2*2*1*1,
#种类为2的情况是,72=2*2*2*3*3,显然也可以
#按照样例输入
# 样例输入
# 7
# 2
# 6
# 12
# 4
# 8
# 24
# 72
# 输出
# no
# no
# no
# yes
# yes
# no
# yes
n = int(input())
ll = []
for i in range(n):
ll.append(int(input()))
#情况这样考虑:如有8、72这两个数,则考虑 2^3 * 1^2,8*9 = 2*2*2*3*3
#如99,约数有3、3、11,保存在mm中得mm = [3,3,11],然后有个列表kk = [3,11],具体操作kk=list(set(mm))
#则说明mm.count[kk[0]] = mm.count[3]= 2,mm.count[kk[1]] = mm.count[11] = 1,
#此时只需要判断是否有两个不同的约数,或只有一个约数,且每个约数个数大于1,就行了
#这里种类为2和1都行,如8=2*2*2,其约数种类是1即只有2,但其显然可以2*2*2*1*1,
#种类为2的情况是,72=2*2*2*3*3,显然也可以
mm = []#用以保存每次数的所有约数,如72拆成,2,2,2,3,3,保存为mm = [2,2,2,3,3]
#类似于声明一下后面的拆分函数
def foo(x):
Divisor(x)#拆分函数
#主函数
if __name__ =="__main__":
#开始调用处理输入的每一个值
for x in ll:
mm = []#初始化,用来装x的约数,foo函数会使用
foo(x)#拆x的约数
kk = list(set(mm))#用set集合,去除一次重复元素并转化成list给kk,用作查找数,因为我们需要找到某数的重复的次数
#开始查找,并统计每个约数个数都大于1,这里种类为2和1都行,如8=2*2*2,其约数种类是1即只有2,但其显然可以2*2*2*1*1,
#种类为两种的情况是,72=2*2*2*3*3,显然也可以
#print(mm)
flag = 0#flag是标识一下'no',和'yes',1表示输出了no,0表示要输出yes
for j in range(len(kk)):
#print(mm.count(kk[j]))
if mm.count(kk[j]) < 2:#说明有小于2的个数,不可能成立
print('no')
flag = 1
break
if flag == 0:#flag = 0说明没有输出'no',是正常结束的,即所有约数个数都大于1,或者满足上文的两类情况
print('yes')
#拆分出最小的公约数元素,如72拆成,2,2,2,3,3。又如8,拆成2*2*2,显然两个都满足
def Divisor(x):
j = 1#j是遍历值,这里声明为全局,为了后面对比
for j in range(2,int(x/2)+1):
if x % j == 0:#如果x如,72%2 == 0,36%2 == 0,18 % 2,== 0,9%3 == 0,然后发现3进不了循环处理最后一位
#print(x,j,x/j)
mm.append(j)
break
if j == 1:#继续上文样例,发现3进不了循环要处理这最后一位,即j不会变化依然为1说明是最后一项,也可以说这是个质数不能继续约分了
#print(x)
mm.append(x)#最后一位入列表
else:#继续找最小约数,如72/2 = 36,36可以继续找约数,36/2=18,go on,18/2=9,go on,9/3 = 3
Divisor(int(x/j))
return
# 样例输入
# 7
# 2
# 6
# 12
# 4
# 8
# 24
# 72
# 输出
# no
# no
# no
# yes
# yes
# no
# yes