Re: [問題] 針對一些考題的疑問。
※ 引述《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
10/23 23:54, 1F
→
10/23 23:58, , 2F
10/23 23:58, 2F
→
10/23 23:59, , 3F
10/23 23:59, 3F
→
10/24 13:34, , 4F
10/24 13:34, 4F
→
10/24 13:35, , 5F
10/24 13:35, 5F
討論串 (同標題文章)