python 素因子分解

zhaorongzhen1 2016-05-04 09:19:00
def Getfactors(str_num): #输出一个整数的约数
try:
num=int(str_num)
l=[]
for i in range(1,int(num/2)+1):#保证num/2的数值超过num的一半
re=num%i
if re==0:
l.append(i)
l.append(num)
'print l'
except:
print('%s not have factors'%str_num)
return l


def isprime(str_n): #判断参数是不是素数,返回布尔类型
try:
num=int(str_n)
l=[]

for i in range(1,num/2+1):
re=num%i
if re==0:
l.append(i)
if len(l)==1:
return 1
else:
return 0
except:
print('%s is not integer!'%str_n)


number=raw_input('please input number:') 利用之前定义的两个函数,输出一个整数的所有素因子
list_factor=Getfactors(number)
print list_factor
list_factor.reverse()
print list_factor
list_divisor=[]
m=0
for i in range(m,len(list_factor)-1):
for n in range(i+1,len(list_factor)-1):
if list_factor[i]%list_factor[n]==0:
num=list_factor[i]/list_factor[n]
list_divisor.append(num)
m=n
break

if isprime(list_factor[i])==1:
list_divisor.append(list_factor[i])
print list_factor[i]
break

print list_divisor


我的想法是:利用给定整数的约数列表,从最大的约数开始,逐个除以后续的约数,直到能整除,输出商,再用除数除以后面的约数,继续输出商,直到除数是素数,把除数也输出出来;例如求12的素因子分解,12的约数是[1,2,3,4,6,12],12/6=2,6/3=2,3是素数,所以12的素因子列表就是[2,2,3]
按照我的想法,写出如上代码,在for循环中,range方法无法满足要求,请教高手怎么能写才合适

...全文
510 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
艺元丶 2019-10-22
  • 打赏
  • 举报
回复
suyinzi =[]


def isprime(number):
    count = number // 2
    while count > 1:
        if number % count == 0:
            return False
        count -= 1
    else:
        return True


def getfactors(integer):
    count = 1
    factor = []
    while count <= integer:
        if integer % count == 0:
            factor.append(count)
        count += 1
    else:
        return factor


def prime_factors(integer):
    allfactors = getfactors(integer)
    max_primefactors = max([x for x in allfactors if isprime(x)])
    factor = int(integer / max_primefactors)
    suyinzi.append(max_primefactors)
    if isprime(factor):
        suyinzi.append(factor)
        return suyinzi
    else:
        return prime_factors(factor)


if __name__ == '__main__':
    print(getfactors(20))
    print(prime_factors(20))
zhaorongzhen1 2016-05-06
  • 打赏
  • 举报
回复
引用 2 楼 xpresslink 的回复:
>>> N = 12 >>> filter(lambda x:N%x==0,[p for p in range(2, N/2) if 0 not in [ p % d for d in range(2, int(p**0.5)+1)]]) [2, 3] >>> 思路是找到小于的N/2的素数列表,把不能被N整除的过滤掉
你的思路不对,有的整数的素因子有可能是重复,而在小于N/2的素数列表中不会出现重复的素数因子,比如12 的素因子应该是2*2*3,而12的素数列表是[2,3],与要求不符
混沌鳄鱼 2016-05-05
  • 打赏
  • 举报
回复
>>> N = 12 >>> filter(lambda x:N%x==0,[p for p in range(2, N/2) if 0 not in [ p % d for d in range(2, int(p**0.5)+1)]]) [2, 3] >>> 思路是找到小于的N/2的素数列表,把不能被N整除的过滤掉
屎克螂 2016-05-05
  • 打赏
  • 举报
回复

def isprime(num):
    count = num / 2
    while count >1:
        if num % count == 0:
            return False
            break
        else:
            count -= 1
    else:
        return True
def getfactor(num):
    l = []
    if isprime(num):
        return [num]
    count = num / 2
    for n in range(2, count + 1):
        if num % n == 0 and isprime(n):
            l.append(n)
    return l

def suyinzi(num):
    fac = getfactor(num)
    mul = 1
    for n in fac:
        mul *= n
    if mul == num:
        return fac
    else:
        return fac + suyinzi(num / mul)

print suyinzi(20)

37,720

社区成员

发帖
与我相关
我的任务
社区描述
JavaScript,VBScript,AngleScript,ActionScript,Shell,Perl,Ruby,Lua,Tcl,Scala,MaxScript 等脚本语言交流。
社区管理员
  • 脚本语言(Perl/Python)社区
  • IT.BOB
加入社区
  • 近7日
  • 近30日
  • 至今

试试用AI创作助手写篇文章吧