小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

從一道無聊的奧數(shù)題發(fā)現(xiàn)Python真的爽翻了,感覺Pyhton無所不能啊

 xylloyd 2019-10-15

在其他平臺我看到一張圖片,里面的內(nèi)容也引發(fā)了我的興趣!

從一道無聊的奧數(shù)題發(fā)現(xiàn)Python真的爽翻了,感覺Pyhton無所不能啊

Hmmm,這道題本身不難,只需要簡單的推理就可以做出來:

  1. 3位數(shù)+3位數(shù)等于4位數(shù),那么“要”只能是1。
  2. 同上,“好”+“要”>=10,因此“好”只能是9,“做”是0。
  3. 個位是兩個“好”相加,于是“事”是8。

所以答案是,“要做好事”=1098。不過今天的重點并不在這里,因為我這張圖片下方貼了一段代碼,大概是有哪位家長無聊寫的:

從一道無聊的奧數(shù)題發(fā)現(xiàn)Python真的爽翻了,感覺Pyhton無所不能啊

小編是一名python開發(fā)工程師,這里有我自己整理了一套最新的python系統(tǒng)學(xué)習(xí)教程,包括從基礎(chǔ)的python腳本到web開發(fā)、爬蟲、數(shù)據(jù)分析、數(shù)據(jù)可視化、機器學(xué)習(xí)等。想要這些資料的可以關(guān)注小編,并在后臺私信小編:“01”即可領(lǐng)取。

void setup(){ Serial.begin(9600); Serial.println('Start'); for (int yao = 0; yao < 10; yao++) { for (int zuo = 0; zuo < 10; zuo++) { for (int hao = 0; hao < 10; hao++) { for (int shi = 0; shi < 10; shi++) { if (yao == zuo || yao == hao || yao == shi || zuo == hao || zuo == shi || hao == shi) continue; if (yao * 1000 + zuo * 100 + hao * 10 + shi == hao * 100 + shi * 10 + hao + yao * 100 + zuo * 10 + hao) { Serial.print('Yao: '); Serial.print(yao); Serial.print(', Zuo: '); Serial.print(zuo); Serial.print(', Hao: '); Serial.print(hao); Serial.print(', Shi: '); Serial.println(shi); } } } } }}

哈哈哈哈果然程序員無處不在,居然要寫代碼來解這道題也是夠無聊的。不過仔細(xì)看看這段代碼貌似是Arduino的C吧,難道這位家長是搞單片機的?

Anyway,程序的思路很簡單,用窮舉法把所有的數(shù)字都試一遍,找出滿足條件(加法等式)的組合。作為一個Python粉,我覺得這樣的代碼實在缺乏美感,特別是套了4層循環(huán),而且還用了一個特別low的判斷來檢查4個數(shù)字是不是相互重復(fù)(根據(jù)題目,每個漢字代表一個不同的數(shù)字,所以相互之間不應(yīng)該重復(fù))。這道題目只是4位數(shù),要是位數(shù)更多的話,這么寫真的要累死啦。

那么用Python寫這樣一個程序,能不能簡潔一點呢?我們換個思路,4個漢字,每個漢字的取值范圍都是0-9,且相互之間不重復(fù),這相當(dāng)于從包含10個元素的集合[0,9]中任取4個元素的排列(permutation),即P(10,4)。學(xué)過排列組合的話我們就可以計算出P(10,4) = 10x9x8x7 = 5040,也就是說一共有5040種不同的排列方式。

Python里面有一個神器叫迭代器(iterator),而且Python還自帶了itertools標(biāo)準(zhǔn)庫,用來產(chǎn)生各種各樣的迭代器,其中就包括排列組合迭代器。這樣一來事情就簡單了,我們先產(chǎn)生一個排列迭代器,然后再用for迭代它,就可以找出滿足條件的排列了,不需要寫4層循環(huán),也不需要檢查4個數(shù)字是否相互重復(fù):

import itertoolsfor i in itertools.permutations(map(str, range(10)), 4): if int('{0}{1}{0}'.format(i[2], i[3])) + int(''.join(i[:3])) == int(''.join(i)): print('YAO:{}, ZUO:{}, HAO:{}, SHI:{}'.format(*i)) break

哇塞,爽爆了,只需要5行代碼!而且其實最后一行break沒有也無所謂,上面那段C的代碼也沒有做循環(huán)跳出嘛。運行一下看結(jié)果:

YAO:1, ZUO:0, HAO:9, SHI:8

完美!忽然發(fā)現(xiàn)自己也真的是很無聊呢。。。

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多