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

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

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

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

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

2 回答

?
拉風(fēng)的咖菲貓

TA貢獻(xiàn)1995條經(jīng)驗 獲得超2個贊

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

TA貢獻(xiàn)1796條經(jīng)驗 獲得超7個贊

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

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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