文章目录
在此看文章之前给,请阅读这条,所有的解释全在代码里的注释,写的还算是比较详细的,有什么不懂的还请大家留言,这对我很重要,我会提升自己,去更好的写一些博客.若对你有帮助还请点个赞就好啦!_本程序耗时5-6小时,博客耗时1小时左右
一、在我们做这个程序之前要先了解一些数学常识。
1、定义。
- 数分为有理数和无理数,我们所需要的两个都属于有理数,在有理数里,分为了整数和小数,而我们需要的质数和素数属于整数中的正整数。
- 在正整数里面我们可以分为质数和素数两大类。
质数:质数又称素数。一个大于1的自然数,除了1和它自身外,不能被其他自然数整除的数叫做质数。
合数:合数是指在大于1的整数中除了能被1和本身整除外,还能被其他数(0除外)整除的数。
**注意:**1既不是素数(质数)也不是合数所以在写程序的时候要考虑到这个因素。
二、接下来我们就开始编写程序。
1、我们已知了什么是素数什么是合数,那么在写总程序之前我们先研究一下怎么判断素数和合数。
'''
功能:判断一个数是不是素数
作者:Sherry
时间:2021.11.11
'''
from math import sqrt #这里导入math中的sqrt模块原因在后续说明
n = int(input('请输入一个整数:'))
if n <= 0: #这里就很明显了,我们要防止用户是输入一个小于1的数
print('请输入正整数!')
else: #从这里开始我们就等于是开始了判断是素数 or 合数
is_price_number = True #假设永真
for i in range(2, int(sqrt(n) + 1)): #我们在此利用了平方根,让这个循环变得少一些,
#当然你也可以去掉这个sqrt直接写n也可以
#这里的i初始值是2,末始值是这个数的平方根(别写成大于n的就好)
if n % i == 0: #这里求余数 余数为0说明i 是 n 的因数,又因为i 没有包含 1 和 n
#所以此时的n为合数
is_price_number = False #此时 n 为合数 那么我们就将一开始的永真变为假
break
if n == 1: #这里是处理 1 这个数的方法
print('{}既不是素数,也不是合数' .format(n))
#剩下的显而易见了把
elif is_price_number == True:
print('{}是素数' .format(n))
else:
print('{}是合数' .format(n))
2、在我们判断素数和合数之后,我们要去想怎么样才能输出质因数。
n = int(input('请输入整数:'))
print('{} = '.format(n),) #这里我们输出一个n来当作我们最后结果的n =
#在这里我们输出了第一个因数
if n in range(n):
print('{}'.format(n)) #这里输出的情况是质数,而我们这次是出去了质数的,
#所以这个if可以省略
#这里我们建立了循环输出因数的循环
while n not in range(n): #保证食醋胡了一个质因数之后继续循环输出质因数
for j in range(2, n + 1):
if n % j == 0:
n = int(n / j) #这里写成 n /= j 的话会出现一个错误,就是浮点数(float)
#因为在二次循环的时候n有时候会变成浮点数,
#所以我们用一个int来取整
if n == 1: #这里是输出重复值,也就是3 * 3之类的
print(j)
else: #在这里输出j,但是前提我们要保证这个j是一个质数
print('{} *'.format(j),end=' ')
break
3、做一些细微的调整就是源码了。
- 对了这里我多加了一些限制条件,所以看起来和上面的代码有些不一样,若需要多次输入,请自己添加循环,这个源代码只能运行一次。
- 还有一点我忘了说,在每次print之后都有个end=’ ’ 这是为了让输出的结果在一排,不然的话就是每次输出都要换行了。
'''
功能:分解合数的因数
作者:Sherry
时间:2021.11.12
Use-Time:5 Hours About
'''
#导入sqrt函数
from math import sqrt
#让用户输入值
try: #try在这里防止用户输入非数字
while True:
n = int(input('请输入一个整数:'))
if n <= 0: #这个if让限制输入值只能是正整数
n = int(input('请输入一个正整数:'))
continue #continue 在用户输入非负值得时候重新输入正整数
else:
#一下是判断是否是合数
is_price_number = True #假设永真
for i in range(2, int(sqrt(n) + 1)):
if n % i == 0:
is_price_number = False #判断为是否有真因数
break
#这里is_price_number == False是判断为合数
if is_price_number == False:
print('{} = '.format(n), end=' ')
composite_number = n #conmposite_number 译:合数
if n in range(n):
print('{}'.format(n)) #这里输出的情况是质数,而我们这次是出去了质数的,
#所以这个if可以省略
#开始循环输出质因数
while n not in range(n): # 保证输出了一个质因数之后继续循环输出质因数
for j in range(2, n + 1):
if n % j == 0:
n = int(n / j) #这里写成 n /= j的时候会报错,
# 因为除法在第二次循环的时候把n变成了浮点数
if n == 1: #这里是输出重复值也就是3 * 3之类的
print(j)
else: # j 一定是素数
print('{} *'.format(j), end=' ')
break
else:
print('请重新运行程序并输入合数!')
break
except ValueError:
print('请重新运行并输入正整数!')
4、最后配上一个实验图。
5、当然,漏洞要放在最后是吧。
-虽然我们输出了这个分解合数的质因数,但是我的这个程序有个bug,如图所示:
- 这里是程序还未结束,如果我强制结束就会有个报错,如图:
- - 该问题现在还未解决,还请各位大佬出出招啦。
6、感谢。
- 感谢你对我的支持,既然来了,何不留下一个大拇指再走呢你说是吧,嘿嘿……
- 对了,有什么方法能够改进这个代码也请留言或者私信一下小编,或者有什么不懂的也可以私信和留言小编哦。