Re: [問題] 針對一些考題的疑問。

看板C_and_CPP作者 (十三)時間12年前 (2012/01/08 21:42), 編輯推噓1(100)
留言1則, 1人參與, 最新討論串4/6 (看更多)
其實如果是我面試我一定會問清楚以下: 除法和取餘的"概念"是否能用。 /和%一定不能用的,那除以4我改>>2這樣算對還是錯? 在我的標準我覺得是不能用的。 但想來想去似乎還是倚賴了位元運算。 我的寫法和E大雷同,概念上都是對4動腦筋。 方法是可以分四部分那就把三部分丟掉,留最後一部分和分四部分剩下的零數。 一直做到不能分四部分,再探討其結果。 unsigned MOD3(unsigned x) { unsigned work = x, part; while(work > 3) { part = work >> 2; work = work - (part << 2) + part; } return work == 3 ? 0 : work; } ※ 引述《EdisonX (閉上眼的魚)》之銘言: : 標題: Re: [問題] 針對一些考題的疑問。 : 時間: Sun Jan 8 18:57:56 2012 : : ※ 引述《Arton0306 (Ar藤)》之銘言: : : 我只是想針對 Q2 做一點意見。 : : : : Q2.寫一個檢查輸入為3倍數的函數,但不能使用除法和餘數。 : : : 除了使用 : : : while(input>2){input-=3 check=input}if(check)... : : : 這種算法外,還有更好的算法嗎? : : 這方法不錯了 : : 不然利用3倍數的特性 寫一個function 把原數字轉字串後取出每個位的數字 求和 : : 看是否大於9 是的話 recursive 不是的話 若數字是0 3 6 9那就是3倍數 : : 之前某論壇也是看到這題,目前大多都放在這解法上, : 後來想到另一解法。 : : 看一下這特性 - : : 95 mod 3 = (1 + 32 + 64 ) mod 3 = 1 mod 3 = 3 : : 這特性是花五分鐘觀查出來的,我也不保證這是最快的方式, : (面試的時候可能是很久的時候,所以第一次看到可能會想不到) : : 2^n + 2^(n+1) 必為 3 之倍數 : : 所以用 shift right + and gate 可做一點加速,效率會不會比較快留著待分析 : ( 和布斯乘法器一樣,有些情況會比較慢 ) : 類似觀念可以變成用 3bits、4bits 方式分析,(3 bits 可能不好做或不能做) : ( 就像是改善形的布斯乘法器 ) : : : unsigned Mod3(unsigned x) : { : unsigned sum; : do{ : sum = 0; : while(x) { : sum+=x&0x3; // 取最後 2 bits : x>>=2; : } : x = sum; : }while(sum>3); : return sum==3 ? 0 : sum; // 最後等於 3 額外判斷 : } : : 這應也不是最快的方式,在猜想最快的方式應該是用 floating multi. 去做, : 可能一、二行就出來了,只是那個 magic number 可能面試的時候時間有限, : 找不出來吧。 : : -- : If there is no tomorrow, : I want to see u last time. : : -- : ※ 發信站: 批踢踢實業坊(ptt.cc) : ◆ From: 180.177.76.201 : ※ 編輯: EdisonX 來自: 180.177.76.201 (01/08 19:16) : 推 Arton0306:推!數學的方法很帥! 01/08 20:07 : → EdisonX:謝謝 A 大稱讚,這份code還有改善空間便是 ^^ 01/08 20:11 : → DEATHX:讚,小弟我這邊看了覺得受益良多。 01/08 21:29 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 114.25.211.58

01/10 13:38, , 1F
跟我的想法一樣~~
01/10 13:38, 1F
文章代碼(AID): #1F2Pr4Of (C_and_CPP)
討論串 (同標題文章)
文章代碼(AID): #1F2Pr4Of (C_and_CPP)