Re: [問題] 條件式判斷

看板C_and_CPP作者 (2塊錢立頓紅茶包)時間15年前 (2011/02/10 21:06), 編輯推噓3(3010)
留言13則, 3人參與, 最新討論串3/8 (看更多)
※ 引述《doggingg (doggingg)》之銘言: : There are 4 tests for 10 students with grade ranges as: : A:(grade>=90) : B:(90>grade>=80) : C:(80>grade>=70) : D:(70>grade>=60) : E:(grade<60) : write a nested loop to count the number of grades, : eg. 10'A's , 15'B's,etc and put the results into sc[5] : (you can not use if statement) : 題目是說10個同學每人有四個成績共40個成績,計算A等級幾個,B等級幾個 : 把這五個等級的個數放進sc陣列中, : 我想請教的是,不用if寫,要怎麼寫,是用switch嗎? 還是?: for (i = 0; i < 10; i++) { sc[min(4, max(0, (grade[i] - 50) / 10))))]++; } 利用 min(X, max(Y, ...)), 可以結果約束在 X 與 Y 之間. :-) -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 114.42.10.59

02/10 22:07, , 1F
min max 正常情況下還是避不掉 if
02/10 22:07, 1F
※ 編輯: iamlouis 來自: 114.42.10.59 (02/11 00:44)

02/11 00:50, , 2F
#define min(x,y) (((x+y)-(x-y)/abs(x-y)*(x-y))/2)
02/11 00:50, 2F

02/11 00:51, , 3F
#define max(x,y) (((x+y)+(x-y)*(x-y)/(x-y))/2)
02/11 00:51, 3F

02/11 00:53, , 4F
利用 x-y 的正負號做花樣, min/max 就不用 if 來實作了.
02/11 00:53, 4F

02/11 00:54, , 5F
其實速度沒有比較快,程式可讀性也很差,只是為了硬凹啦~XD
02/11 00:54, 5F

02/11 09:33, , 6F
abs 也難避免 if
02/11 09:33, 6F

02/11 09:34, , 7F
除非要搞 bit hacks
02/11 09:34, 7F

02/11 09:37, , 8F
啊, 底下有人回了 XD
02/11 09:37, 8F

02/11 21:57, , 9F
#define abs(x) (x^(x>>31)-(x>>31)) 嘿嘿嘿~ :-)
02/11 21:57, 9F

02/11 21:58, , 10F
如果 x<0, 就是把 x XOR 0xff... 再減掉 0xff...
02/11 21:58, 10F

02/11 21:59, , 11F
也就是 NOT x 後再減 -1 (也就是加1), 也就是二的補數.
02/11 21:59, 11F

02/11 22:00, , 12F
如果 x>=0,則 x^0-0, 也就是 x 本身 (我跟gcc偷學的) XD
02/11 22:00, 12F

02/11 23:00, , 13F
樓上這個不錯!
02/11 23:00, 13F
文章代碼(AID): #1DK-Bb4d (C_and_CPP)
討論串 (同標題文章)
文章代碼(AID): #1DK-Bb4d (C_and_CPP)