python累乘怎么写_python入门级别算法系列 -1 分解质因数

1.题目:分解质因数

将一个正整数分解质因数,即分解为由若干个质数相乘的结果,例如:输入90,打印出

math?formula=90%3D2*3*3*5, 其中2、3、5都是质数。该题目思路比较简单,只需要用while for循环即可解决,适合新手入门python进行练习,本文将由易到难介绍几种实现思路,并附上代码和所需要的知识点。

2.思路1:首先设置函数判断是否是质数,然后依次进行分解

直接上代码

#判断数据是否是质数,用于保证大整数分解时每一个因子都是质数

def zhishu(num):

for i in range(2,num):

if num % i == 0:

#print('%d 是个合数,可以分解' %num)

return True

#break 楼主之前一个版本加了break,忽略了函数return之后其他语句不会执行,相当于break了。

else:#和for对齐,是python独有的语法如果for循环里的语句执行结束后执行else语句,如果for循环里有break则else后的语句不会执行。

#print('%d 是个质数,请输入1个合数' %num)

return False

def zhiyinshufenjie(num):

nump = num#用于输出 90 = 2*3*3*5

tmp = []

if not zhishu(num):

print('%num是个质数,请输入一个合数')#如果是质数则不用执行语句

else:

while num:#用于控制循环次数直到为0

if not zhishu(num) and num != 1:#排除1,因为1在分解中没有意义

tmp.append(num)

num = 0

else:

for i in range(2, int(num**(1/2))+1):#num**(1/2)为了缩短计算范围,在计算超大数时有用

if num % i == 0 & (not zhishu(i)):

tmp.append(i)

num = int(num/i)

#print(i)

break

#print(num)

tmp = sorted(tmp)#排成有序数组

#设置打印格式

str1 = ''

for i in range(len(tmp)):

if i== 0:

str1= str1 + str(tmp[i])

else:

str1= str1 + '*' +str(tmp[i])

returnstr = '%d = %s' % (nump,str1)

return returnstr

a=zhiyinshufenjie(888888)

print(a)

这种思路比较简单,基本没过大脑,遇到问题采用暴力求解的方式解决,存在很多可以优化的地方。

3.思路2:优化求解法,是在第一种思路下进行优化

第二种思路区别于第一种思路在于,第一个被整除的数永远是质数,比如1,2,3,5,7,如果是4和6那么也能被2整除。此时只需要不断更新被除后的数,就能计算出最终的质因数。此处还有几个小技巧,如保持除完以后还是整数,用//,在同一行打印,则设置print的参数为end=''。

def fenjiezhiyinshu(num):

n = num

f = []

for j in range(1,num//2+1):

for i in range(2, n):

if n % i == 0:

f.append(i)

n = n//i

break

if len(f) == 0:

print("这是一个质数,请重新带入合数")

else:

f.append(n)

f.sort()

print('%d=%d'% (num,f[0]), end='')

for i in range(1,len(f)):

print('*%d'%f[i] ,end='')

4.思路3:递归求解法

质因数分解时非常适合做递归算法练习的一个问题,程序的最终出口为不断输出可以被输入值整除的质数,直到最后一个数。

import numpy as np

def zhiyinshufenjie(num, tmp):

for i in range(2,int(num**(1/2))+1):

if num % i == 0:

tmp.append(i)

num = num//i

return zhiyinshufenjie(num,tmp)

if len(tmp) == 0:

print('%d是个质数'%nn)

else:

tmp.append(num)

str1 = ''

for i in range(len(tmp)):

if i== 0:

str1= str1 + str(tmp[i])

else:

str1= str1 + '*' +str(tmp[i])

returnstr = '%d=%s' % (np.cumprod(tmp)[-1],str1)

return returnstr

由于是递归没法保存第一个输入的num值,因此用了numpy的cumprod函数对列表进行累乘,得到最初的值。当然这个递归还可以写的更简单,定义的质因数分解函数第二个参数可以设置为str,这样的话第一个输入的num值就可以以str形式保存下来,再不断迭代得到

math?formula=90%3D2*3*3*5的输出格式,这部分留给读者自己去考虑完成。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值