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

看板C_and_CPP作者 (BL2400PT真不錯)時間11年前 (2012/10/23 23:34), 編輯推噓1(104)
留言5則, 3人參與, 最新討論串6/6 (看更多)
※ 引述《EdisonX (閉上眼的魚)》之銘言: : 2012/01/10 修正範例錯誤,新增三份註解 : ※ 引述《Arton0306 (Ar藤)》之銘言: : 我只是想針對 Q2 做一點意見。 : : 這方法不錯了 : : 不然利用3倍數的特性 寫一個function 把原數字轉字串後取出每個位的數字 求和 : : 看是否大於9 是的話 recursive 不是的話 若數字是0 3 6 9那就是3倍數 : 之前某論壇也是看到這題,目前大多都放在這解法上, : 後來想到另一解法。 討論一下好了,其實這Q2,檢查3的倍數,很簡單啊 10進位下,位數累加可以用來檢查9和3的倍數 16進位下,位數累加應該可以用來檢查15/5/3的倍數 也就是說.N進位下,位數累加可以知道是否是N-1以及N-1的因數的倍數 假定數字是0xA00002,我作0xA+0x2的運算去檢查會一樣嗎? 不過事實上.. 0xA+0x2=(0xA00000-0xA*0xFFFFF)+0x2 和原數字0xA00002的差異是0xA*0xFFFFF,而這個數值必定是0xF的倍數 因此(0xA+0x2) mod 0xF 和 (0xA00002) mod 0xF是一樣的數值 所以累加各16進位的數字來檢查是可以的..... void func(unsigned int input) { unsigned int result; result=(input&0xF)+(input&0xF0 >> 4)+(input&0xF00 >> 8) +(input&0xF000 >> 12)+(input&0xF0000>>16)+(input&0xF00000>>20) +(input&0xF000000>>24)+(input&0xF0000000>>28); // 這時候最大可能累計到120左右 還可以再累加位數一次 while (result > 0xF) {//這邊最多跑兩次... result=(result&0xF)+(result&0xF0>>4); } switch(result){ case 3: case 6: case 9: case 12: cout <<"3的倍數" << endl; case 5: case 10: cout <<"5的倍數" <<endl; case 15: cout <<"3與5的倍數"<<endl; default: count <<"不是3或者5的倍數"<< endl; } } 以後出題可以出幾個不用mod和除法,檢查31,62,63的倍數之類的....... (會不會太惡劣 :P) -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.114.78.54

10/23 23:54, , 1F
nice job!! (面試系列題庫正火....)
10/23 23:54, 1F

10/23 23:58, , 2F
我沒真的弄code,但是我用小算盤檢查過十幾個數字
10/23 23:58, 2F

10/23 23:59, , 3F
3的倍數確實可以用16進位各位累加判斷
10/23 23:59, 3F

10/24 13:34, , 4F
31的倍數:int x31(k){ if (k>=31) return x31(k-31);
10/24 13:34, 4F

10/24 13:35, , 5F
else return (k==0); }
10/24 13:35, 5F
文章代碼(AID): #1GXhaG18 (C_and_CPP)
討論串 (同標題文章)
文章代碼(AID): #1GXhaG18 (C_and_CPP)