第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

自己用python寫了個(gè)分解質(zhì)因數(shù)腳本,但是總是出錯(cuò)怎么辦?

自己用python寫了個(gè)分解質(zhì)因數(shù)腳本,但是總是出錯(cuò)怎么辦?

阿晨1998 2019-04-16 17:05:22
#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新手。我的具體思路是,搞兩個(gè)txt文件分別儲(chǔ)存質(zhì)數(shù)庫(kù)和目前質(zhì)數(shù)庫(kù)的范圍。利用len()函數(shù)來判斷用戶輸入的數(shù)字是幾位數(shù),如果位數(shù)超過了數(shù)據(jù)庫(kù)的范圍,就自行更新數(shù)據(jù)庫(kù)。舉例:數(shù)據(jù)庫(kù)里面有2-10的所有質(zhì)數(shù),然后我現(xiàn)在輸入20,超出范圍,程序自行更新數(shù)據(jù)庫(kù)到2-100的所有質(zhì)數(shù),再運(yùn)算。這樣就避免了在沒有數(shù)據(jù)庫(kù)的情況下因?yàn)閿?shù)字太大運(yùn)算效率低(犧牲第一次的運(yùn)算效率來計(jì)算質(zhì)數(shù)庫(kù))。但是實(shí)際使用的時(shí)候,我發(fā)現(xiàn)我輸入100,然后程序開始自主更新數(shù)據(jù)庫(kù),但是更新出來的并不是2-100的所有質(zhì)數(shù),僅僅到了29。同理,在輸入很大的數(shù)字的時(shí)候,也只能更新到300多左右的質(zhì)數(shù),也就是說更新的不夠多,但是我檢查了很多遍代碼都沒搞明白問題出在哪里,。。*代碼中的注釋內(nèi)容基本解釋了所有的變量,方便大家看代碼。。。
查看完整描述

2 回答

?
開心每一天1111

TA貢獻(xiàn)1836條經(jīng)驗(yàn) 獲得超13個(gè)贊

先回答你的問題,請(qǐng)檢查你的第一個(gè)for循環(huán)的范圍。range(1*10,2*10)是從10到20的數(shù)字。但你想要的是從10到100的序列。
下面是這段代碼更大的問題,而你并不知道這些問題的存在。
作為python新手,你問出這個(gè)問題,但實(shí)際上無論你用什么語言,這些錯(cuò)誤都是存在的。問題不在于對(duì)語言的掌握程度,而是對(duì)“寫程序”這一技能的掌握程度。
你的程序大概做了幾件事:
1.根據(jù)一個(gè)數(shù)字和一個(gè)質(zhì)數(shù)列表,得到這個(gè)數(shù)字的質(zhì)數(shù)因子
2.輸出質(zhì)數(shù)因子
3.獲得從1到目標(biāo)位數(shù)的質(zhì)數(shù)列表
4.根據(jù)已有數(shù)字位數(shù),和所需數(shù)字位數(shù),產(chǎn)生對(duì)應(yīng)范圍的質(zhì)數(shù)列表
5.將計(jì)算結(jié)果的位數(shù)和質(zhì)數(shù)列表存儲(chǔ)于某處
6.從某處讀取目前存儲(chǔ)的質(zhì)數(shù)列表和其對(duì)應(yīng)的位數(shù)
在這段代碼里所有的事情都混雜在一起。這樣的壞處是,當(dāng)一件事情變化時(shí),其它部分也會(huì)受影響,即使它們并不真正與之相關(guān)。
想象一下有一個(gè)網(wǎng)站提供服務(wù)給出質(zhì)數(shù)列表。你的代碼會(huì)怎么改變
想象你的程序的輸出是個(gè)頁(yè)面
你能否寫一段完全不用修改的代碼可以用在上述不同場(chǎng)景?
當(dāng)程序正確的分塊后,你可以分別驗(yàn)證它。就算你自己找不到出錯(cuò)的地方,但你至少知道1,2,3,5,6都可以正常工作,因而查找范圍或提問都會(huì)有針對(duì)性得多。
另有一個(gè)小問題,產(chǎn)生質(zhì)數(shù)的代碼中優(yōu)化上限*0.5是不恰當(dāng)?shù)?,?yīng)該為開平方。
驗(yàn)證自己所寫的每行代碼,而不是猜測(cè)它們?nèi)绾喂ぷ?pre>
                            
查看完整回答
反對(duì) 回復(fù) 2019-04-16
?
手掌心

TA貢獻(xiàn)1942條經(jīng)驗(yàn) 獲得超3個(gè)贊

這個(gè)求素?cái)?shù)的算法貌似應(yīng)該很經(jīng)典啊。
求素?cái)?shù)的算法應(yīng)該是這樣:
1)輸入字符,假設(shè)為number,判斷number是否大于0
2)求平方根加1,設(shè)置為a
3)number對(duì)1~a之間的數(shù)字判斷是否取余為0即可。
比如你輸入15,那么取余+1,應(yīng)該是4.那么你就依次判斷1~4之間的數(shù)是否能整除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
在我的機(jī)子上用了1.5秒求了10w以內(nèi)的素?cái)?shù)。
當(dāng)然,求素?cái)?shù)的算法有很多種,你這種將數(shù)據(jù)緩存起來的思路是對(duì)的,不過算法寫的還是應(yīng)該可以加強(qiáng)些,起碼應(yīng)該可讀性更強(qiáng)些。
                            
查看完整回答
反對(duì) 回復(fù) 2019-04-16
  • 2 回答
  • 0 關(guān)注
  • 317 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)