为了账号安全,请及时绑定邮箱和手机立即绑定

自己用python写了个分解质因数脚本,但是总是出错怎么办?

自己用python写了个分解质因数脚本,但是总是出错怎么办?

慕后森 2019-04-07 11:18:55
#Num(originalnumber);Lg(lengthoforiginalnumber);Lf(lengthfile);#Pl(primeslist);Pf(primefile);Ps(primes);d(listofanswers);#length(opentxtfile'length');Pb(opentxtfile'primebase');Qpt()Num=raw_input('Pleaseinputanumber!\nNumber:')Lg=len(Num)length=open('length.txt','r+')Lf=length.readlines()Pb=open('primebase.txt','r+')Pl=Pb.readlines()ifint(Lg)>int(Lf[0]):print'Noenoughprimesindatabase!\nUpdatingthedatabase...'foriinrange(int(Lf[0])*10,int(Lg)*10):Qpt=0forxinrange(2,int(i*0.5)+1):ifi%x==0:Qpt+=1ifQpt!=0:breakifQpt==0andi!=0andi!=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'Finishupdatingdatabase!'d=[]Num=int(Num)whileNum!=1:foriinPl:i=int(i)ifNum%i==0:Num=Num/id.append(i)ifd==[]:print'Primenumber!'else:print'Primefactors:'foriind:printielse:d=[]Num=int(Num)whileNum!=1:foriinPl:i=int(i)ifNum%i==0:Num=Num/id.append(i)ifd==[]:print'Primenumber!'else:print'Primefactors:'foriind:printi本人py新手。我的具体思路是,搞两个txt文件分别储存质数库和目前质数库的范围。利用len()函数来判断用户输入的数字是几位数,如果位数超过了数据库的范围,就自行更新数据库。举例:数据库里面有2-10的所有质数,然后我现在输入20,超出范围,程序自行更新数据库到2-100的所有质数,再运算。这样就避免了在没有数据库的情况下因为数字太大运算效率低(牺牲第一次的运算效率来计算质数库)。但是实际使用的时候,我发现我输入100,然后程序开始自主更新数据库,但是更新出来的并不是2-100的所有质数,仅仅到了29。同理,在输入很大的数字的时候,也只能更新到300多左右的质数,也就是说更新的不够多,但是我检查了很多遍代码都没搞明白问题出在哪里,。。*代码中的注释内容基本解释了所有的变量,方便大家看代码。。。
查看完整描述

2 回答

?
大话西游666

TA贡献1817条经验 获得超14个赞

先回答你的问题,请检查你的第一个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是不恰当的,应该为开平方。
验证自己所写的每行代码,而不是猜测它们如何工作
                            
查看完整回答
反对 回复 2019-04-07
?
HUWWW

TA贡献1874条经验 获得超12个赞

这个求素数的算法貌似应该很经典啊。
求素数的算法应该是这样:
1)输入字符,假设为number,判断number是否大于0
2)求平方根加1,设置为a
3)number对1~a之间的数字判断是否取余为0即可。
比如你输入15,那么取余+1,应该是4.那么你就依次判断1~4之间的数是否能整除15即可。
python代码
importmath
defisPrime(number):
assertnumber>=0
ifnumber==0ornumber==1:
returnFalse
sqrtNumber=int(math.sqrt(number))+1
foriinrange(sqrtNumber,1,-1):
ifnotnumber%i:
returnFalse
returnTrue
defgetAllPrimes(number):
retval=[]
foriinrange(number):
ifisPrime(i):
retval.append(i)
returnretval
if__name__=='__main__':
importtime
start=time.time()
getAllPrimes(10*10000)
printtime.time()-start
在我的机子上用了1.5秒求了10w以内的素数。
当然,求素数的算法有很多种,你这种将数据缓存起来的思路是对的,不过算法写的还是应该可以加强些,起码应该可读性更强些。
                            
查看完整回答
反对 回复 2019-04-07
  • 2 回答
  • 0 关注
  • 377 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信