质数(素数)与合数:
合数指自然数中除了能被1和本身整除外,还能被其他数(0除外)整除的数。
与之相对的是质数,质数定义为在大于1的自然数中,除了1和它本身以外不再有其他因数。而1既不属于质数也不属于合数。最小的合数是4。(因数:如果整数a除以整数b(b≠0) 的商是整数,我们就说b是a的因数。)
计算思路:
思路①:
假如要判断一个数字“x”是不是质数,那么根据定义,我们就直接遍历[2,x-1]范围内的的数字“i”,并分别计算每次x%i的结果是否为0,若有一个结果为0,则表明“x”可以被这个“i”整除,即“x”存在除了1和她本身之外的因数,那么x就是合数,反之,就是质数。
代码1.1:
x = int(input("请输入要判断的整数"))
if x < 2: #质数的范围是[2,+∞)
print(x,'不是质数也不是合数')
else:
for i in range(2,x): #对符合质数范围的进行计算
if x%i == 0: #先判断是否为合数
print(x,'是合数')
break
else:
print(x,'是质数') #剩下的都是质数
思路②:
假如一个数c是合数,那么就存在因数a,b(a,b>1),且axb=c,而axb=c表现在坐标轴上就是一个反比例函数。(即:a=c/b,c是常数)
也就是说:当两个数a,b乘积一定时,a与b的值会呈反比例关系。而:
当a=b时,因为 a x b =c,所以a = b = √ ̄c
又因为a,b呈反比例关系,所以a,b至少有一个数字会小于或等于根号c。
(简单来说就是:如果axb=c,则a,b至少有个数会小于等于根号c)
因此,只要小于或等于根号c的数不能整除c。则c一定是质数(这里的“数”排除1)。
那么,于是,就有了第二种思路的(对比第一段代码,加入了一行新代码和修改了一处的取值):
代码2.1
x = int(input("请输入要判断的整数"))
if x < 2:
print(x,'不是质数也不是合数')
else:
x2=int(x**0.5) #求出根号x,并向下取整
for i in range(2,x2+1): #int向下取整了,末尾要 +1
if x%i == 0:
print(x,'是合数')
break
else:
print(x,'是质数')
看起来第二种思路似乎会比第一种思路减少了一半的计算量,我们慢慢丰富代码,最后比一下两种方式的计算时间吧。
丰富代码:
1、加入循环,使得用户可以重复提交想要判断的数字
思路①更改后:
代码1.2
x = int(input("请输入要判断的整数"))
y=x #配合while达成循环
while x == y: #让程序能不停的循环,不知道有没有更好的方法····
if x < 2:
print(x,'不是质数也不是合数')
else:
for i in range(2,x):
if x%i == 0:
print(x,'是合数')
break
else:
print(x,'是质数')
x = int(input("请输入要判断的整数")) #每次输出结果后,用户可以再次输入数据并运行
y=x #配合上面的while达成循环···
思路②更改后:
代码2.2
x = int(input("请输入要判断的整数"))
y=x
while x == y:
if x < 2:
print(x,'不是质数也不是合数')
else:
x2=int(x**0.5)
for i in range(2,x2+1):
if x%i == 0:
print(x,'是合数')
break
else:
print(x,'是质数')
x = int(input("请输入要判断的整数"))
y=x