python因数分解算法_Python分解质因数脚本源码纠错求助

本文探讨了一位Python初学者在实现质因数分解算法时遇到的问题,涉及质数库更新不足及代码组织结构。提出了优化建议,包括修正质数生成范围、分离职责以及使用更高效的素数判断算法,同时分享了一个简洁的素数判断函数和全素数生成示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#Num(original number); Lg(length of original number); Lf(length file);

#Pl(primes list); Pf(prime file); Ps(primes); d(list of answers);

#length(open txt file 'length'); Pb(open txt file 'primebase'); Qpt()

Num=raw_input('Please input a number!\nNumber: ')

Lg=len(Num)

length=open('length.txt','r+')

Lf=length.readlines()

Pb=open('primebase.txt','r+')

Pl=Pb.readlines()

if int(Lg)>int(Lf[0]):

print 'No enough primes in database!\nUpdating the database...'

for i in range(int(Lf[0])*10,int(Lg)*10):

Qpt=0

for x in range(2,int(i*0.5)+1):

if i%x==0:

Qpt+=1

if Qpt!=0:

break

if Qpt==0 and i!=0 and i!=1:

Pl.append('%s\n'%str(i))

Pf=open('primebase.txt','w+')

Pf.writelines(Pl)

Pf.close()

Lf[0]=str(Lg)

file=open('length.txt','w+')

file.writelines(Lf)

file.close()

print 'Finish updating database!'

d=[]

Num=int(Num)

while Num!=1:

for i in Pl:

i=int(i)

if Num%i==0:

Num=Num/i

d.append(i)

if d==[]:

print 'Prime number!'

else:

print 'Prime factors: '

for i in d:

print i

else:

d=[]

Num=int(Num)

while Num!=1:

for i in Pl:

i=int(i)

if Num%i==0:

Num=Num/i

d.append(i)

if d==[]:

print 'Prime number!'

else:

print 'Prime factors: '

for i in d:

print i

本人py新手。我的具体思路是,搞两个txt文件分别储存质数库和目前质数库的范围。利用len()函数来判断用户输入的数字是几位数,如果位数超过了数据库的范围,就自行更新数据库。举例:数据库里面有2-10的所有质数,然后我现在输入20,超出范围,程序自行更新数据库到2-100的所有质数,再运算。这样就避免了在没有数据库的情况下因为数字太大运算效率低(牺牲第一次的运算效率来计算质数库)。但是实际使用的时候,我发现我输入100,然后程序开始自主更新数据库,但是更新出来的并不是2-100的所有质数,仅仅到了29。同理,在输入很大的数字的时候,也只能更新到300多左右的质数,也就是说更新的不够多,但是我检查了很多遍代码都没搞明白问题出在哪里,。。

*代码中的注释内容基本解释了所有的变量,方便大家看代码。。。

先回答你的问题,请检查你的第一个for循环的范围。range(1 * 10,2 * 10) 是从10到20的数字。但你想要的是从10到100的序列。

下面是这段代码更大的问题,而你并不知道这些问题的存在。

作为python新手,你问出这个问题,但实际上无论你用什么语言,这些错误都是存在的。问题不在于对语言的掌握程度,而是对“写程序”这一技能的掌握程度。

你的程序大概做了几件事:

1. 根据一个数字和一个质数列表,得到这个数字的质数因子

2. 输出质数因子

3. 获得从1到目标位数的质数列表

4. 根据已有数字位数,和所需数字位数,产生对应范围的质数列表

5. 将计算结果的位数和质数列表存储于某处

6. 从某处读取目前存储的质数列表和其对应的位数

在这段代码里所有的事情都混杂在一起。这样的坏处是,当一件事情变化时,其它部分也会受影响,即使它们并不真正与之相关。

想象一下有一个网站提供服务给出质数列表。你的代码会怎么改变

想象你的程序的输出是个页面

你能否写一段完全不用修改的代码可以用在上述不同场景?

当程序正确的分块后,你可以分别验证它。就算你自己找不到出错的地方,但你至少知道1,2,3,5,6都可以正常工作,因而查找范围或提问都会有针对性得多。

另有一个小问题,产生质数的代码中优化上限*0.5是不恰当的,应该为开平方。

验证自己所写的每行代码,而不是猜测它们如何工作

这个求素数的算法貌似应该很经典啊。

求素数的算法应该是这样:

1)输入字符,假设为number, 判断number是否大于0

2)求平方根加1,设置为a

3) number对1~a之间的数字判断是否取余为0即可。

比如你输入15,那么取余+1,应该是4. 那么你就依次判断1~4之间的数是否能整除15即可。

python代码import math

def isPrime(number):

assert number >= 0

if number == 0 or number == 1:

return False

sqrtNumber = int(math.sqrt(number)) + 1

for i in range(sqrtNumber, 1, -1):

if not number % i:

return False

return True

def getAllPrimes(number):

retval = []

for i in range(number):

if isPrime(i):

retval.append(i)

return retval

if __name__ == '__main__':

import time

start = time.time()

getAllPrimes(10 * 10000)

print time.time() - start

在我的机子上用了1.5秒求了10w以内的素数。

当然,求素数的算法有很多种,你这种将数据缓存起来的思路是对的,不过算法写的还是应该可以加强些,起码应该可读性更强些。

玩蛇网文章,转载请注明出处和文章网址:https://www.iplaypy.com/wenda/wd18941.html

相关文章 Recommend

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值