分解合数的质因数

在此看文章之前给,请阅读这条,所有的解释全在代码里的注释,写的还算是比较详细的,有什么不懂的还请大家留言,这对我很重要,我会提升自己,去更好的写一些博客.若对你有帮助还请点个赞就好啦!_本程序耗时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、感谢。

  • 感谢你对我的支持,既然来了,何不留下一个大拇指再走呢你说是吧,嘿嘿……
  • 对了,有什么方法能够改进这个代码也请留言或者私信一下小编,或者有什么不懂的也可以私信和留言小编哦。
  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

猫腻余腥

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值