Question:
将一个正整数分解质因数。例如:输入90,打印出90=233*5
方法一:
分两步执行
因为只有合数可以分解质因数,所以先定义一个函数,判断num是否是合数,从而返回一个布尔型,在后面做条件判断时可以调用该函数;
第二步,如果num是质数,则打印重新输入数字;
如果num是合数,则开始进入主题,开始取出所有满足质因数的因子,基本思路是:
质因数和相对应的商同时判断是否都是质因数,如果num%i=0并且i是质数,则取出该i,然后break,然后判断对应的商是否是质数,如果不是质数,则又回到上面的一步,开始取该商相应的质因数,如果num%i=0并且i是质数,取出该I,然后再次判断对应的商是否是质数,如此往复,知道对应的商是质数为止,令num=0跳出循环。
最后在连接90=233*5的时候,用到join来连接。
#判断num是合数还是素数
def heshu(num):
for i in range(2,num):
if num % i == 0:
return True#合数
break
else:
return False#质数
# 当num是合数的基础上来找出所有的可重复的因子
List = []
def fenjie(num):
nump = num
if not heshu(num):
print('请输入一个合数')
else:
while num:
if not heshu(num):
List.append(num)
num = 0
else:
for i in range(2,int(num/2+1)):
if num % i == 0 and not heshu(i):
List.append(i)
break
num = int(num / i)#找出一个质因数以后的相应的另一个商
List.sort()
print(str(nump),'=','*'.join(str(i) for i in List))
fenjie(888)
方法二:
一步到位
先把数字90print出来写在右边,以end=‘’结尾,后面再接相应的左边的乘号。
因为判断能否被2-num的数整除时,取不到1,所以把1单独拎出来做一个条件,
然后再创建一个while循环:
通过if n%i ==0来找出第一个出现的因数i,巧妙的地方在于紧接着用n // i来找相对应的商,如果商=1,则说明此是最后一个要找的质因数i,后面不再有商了,如果不等于1,说明商是合数,则取出相应的i排列在后面,然后该循环体break,再进入下一个循环,再重复计算上面得到的不等于1的商的第一个出现的质因数i,然后再和前面一样,
再取出该新i对应的新商,如果新商=1,则打出最后一个质因数,否则打印出对应的i然后break然后进入下一个循环体,知道找到最后一个质因数满足其只有自身作为因数的那个质因数。
def reduceNum(n):
print('{} = '.format(n),end='')
if not isinstance(n, int) or n <= 0 :
print('请输入一个正确的数字 !')
exit(0)
elif n in [1] :
print('{}'.format(n))
while n not in [1] :# 循环保证递归
for i in range(2, n + 1) :
if n % i == 0:
n //= i
if n == 1:
print(i)
else : # i 一定是素数
print('{} * '.format(i),end='')
break
reduceNum(888)