【问题描述】
给定一个数,如果这个数的因子都是质数,显示yes,否则显示no。
【样例输入】
6
【样例输出】
yes
【样例输入】
8
【样例输出】
no
我先写了个因子的列表,怎么判断列表里所有数是否都是质数,我输出的好多重复。
实现如下:
# encoding:utf-8
import math
import math
def is_zhishu(n):
if n <= 1:
return False
for i in range(2, int(math.sqrt(n)) + 1):
"""循环范围同查找因子类似,由于因子是成对出现的,所以只需要循环到小于平方根的范围就好"""
if n % i == 0:
return False
return True
def yinzi(n):
list_yinzi = []
if n <= 2:
return list_yinzi
for i in range(2, int(math.sqrt(n)) + 1):
"""
为什么循环范围定在平方根呢?:因为一个数的因子是成对的,a=b*c。也就是说:找到一个因子b,肯定会找到相对应的另外一个因子c(a/b)。所以我们的工作量减少了一半。
又有:一个因子变大,另一个因子必然要变小。假设b永远是小的那个,c是大的那个,那么b的最大值就是a的平方根。也就是b=c=(根号a)的时候。所以循环范围定在[1 , a的平方根+1],+1的原因是为了能够取到a的平方根避免遗漏。
"""
# 如果找到了一个因子,那么把其相对应的另一个因子一同加入到因子列表中
if n % i == 0:
list_yinzi.extend([i, n / i])
# 此处的set为了去重,因为会出现两个相同的平方根的情况。所以去掉重复
# sorted重排序是因为,因子都是成对成对找出来的,也就是说一次找到的两个因子肯定会有一大一小。这样把所以因子找完放在一起,大小排序就乱了
result = True
for i in sorted(set(list_yinzi)):
result = is_zhishu(int(i))
if not result:
break
return result
# return sorted(set(list_yinzi))
n = input('请输入: ')
#
res = yinzi(int(n))
if res:
print('yes')
else:
print('no')
测试结果:
# 测试结果
"""
请输入: 6
yes
-------------------
请输入: 8
no
"""
import timeit
from math import sqrt
def isPrimes1(n):
if n <= 1:
return False
for i in range(2, int(sqrt(n) + 1)):
if n % i == 0:
return False
return True
def isPrimes2(n):
if n > 1:
if n == 2:
return True
if n % 2 == 0:
return False
for x in range(3, int(sqrt(n) + 1), 2):
if n % x == 0:
return False
return True
return False
print(timeit.timeit("isPrimes1(100)", setup="from chapter01 import isPrimes1", number=10000))
print(timeit.timeit("isPrimes2(100)", setup="from chapter01 import isPrimes2", number=10000))