這最近code golfing post要求用C快速實現的(假定n
是無符號整數)以下的可能性:如何快速評估零點集?
if (n==6 || n==8 || n==10 || n==12 || n==14 || n==16 || n==18 || n==20)
一個可能的簡化是觀察數字a[]={6,8,10,12,14,16,18,20}
形成arithmetic progression,所以移位的範圍內,然後用一些bitwise tricks
if (((n - 6) & 14) + 6 == n)
導致更短(並且可能實際上更高效)的實現,如John Bollinger的answered。
現在我問什麼是類似優雅(希望同樣有效)實現
if (n==3 || n==5 || n==11 || n==29 || n==83 || n==245 || n==731 || n==2189)
提示的:這一次的數字a[k]
形成幾何級數:a[k]=2+3^k
。
我想在一般情況下,不能比排序數字a[k]
更好,然後做一個對數搜索來測試n
是否是排序數組的成員。
如果這是一個超過空間折衷的時間,那麼我會分配一個填充零的2189字緩衝區,除了特定的位置(3,5,11等),並簡單地執行數組查找(它因爲它是硬件實現的,所以速度非常快)。這不是非常優雅,但會以空間性能的成本爲您提供最佳性能。 –
不應該在http://codereview.stackexchange.com上發佈此類問題嗎? – CinCout
http://stackoverflow.com/questions/1804311/how-to-check-if-an-integer-is-a-power-of-3 – Dummy00001