題目連結(jié):
題目大意:
輸入有多列,每列給定一非負(fù)整數(shù) n (n < 2 ^ 31),請(qǐng)計(jì)算 n 在二進(jìn)位下的表示中有多少個(gè)「1」的位元?
範(fàn)例輸入:
1
2
3
4
範(fàn)例輸出:
1
1
2
1
解題思維:
可以利用建表的方式,預(yù)先計(jì)算 0(含) ~ 65535(含) 各自數(shù)字有多少「1」的位元,作為一個(gè)查詢表。因?yàn)?65535 = 2 ^ 16 - 1 ,因此我們可以將給定的整數(shù) n 分拆成兩等分——即前 16 位元以及後 16 位元。然後各自使用剛剛建立的查詢表去看有多少「1」,最後再加總即是所求。
但是因?yàn)檫@題的時(shí)限卡得非常地緊,光是用普通的輸入就會(huì)超時(shí)。所以需要搭配輸出入的最佳化,可是一般的最佳化也不太夠,基本上要自行撰寫,參見
此題。
即使如此還有點(diǎn)不夠,因此可以在程式碼最前面加一句 #pragma GCC optimize("Ofast")。#pragma 代表現(xiàn)在要對(duì)編譯器作一些設(shè)定、操作或是定義,最佳化就是其中一種設(shè)定,例如在這邊使用的 optimize("Ofast") 就是告訴 GCC 的最佳化選項(xiàng)為 Ofast。
最佳化相關(guān)可以這篇
英文文章,裡面有比較各種選項(xiàng)的執(zhí)行效率,不過沒有對(duì)各種選項(xiàng)做深入的解釋,有興趣的讀者可以自行研究、搜尋。但是在程式解題這個(gè)領(lǐng)域,通常光使用 Ofast 這個(gè)選項(xiàng)便足矣。
此次分享到此為止,如有任何更加簡潔的想法或是有說明不清楚之地方,也煩請(qǐng)各位大大撥冗討論。