看板 C_and_CPP 關於我們 聯絡資訊
※ 引述《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
ledia:min max 正常情況下還是避不掉 if 02/10 22:07
※ 編輯: iamlouis 來自: 114.42.10.59 (02/11 00:44)
iamlouis:#define min(x,y) (((x+y)-(x-y)/abs(x-y)*(x-y))/2) 02/11 00:50
iamlouis:#define max(x,y) (((x+y)+(x-y)*(x-y)/(x-y))/2) 02/11 00:51
iamlouis:利用 x-y 的正負號做花樣, min/max 就不用 if 來實作了. 02/11 00:53
iamlouis:其實速度沒有比較快,程式可讀性也很差,只是為了硬凹啦~XD 02/11 00:54
ledia:abs 也難避免 if 02/11 09:33
ledia:除非要搞 bit hacks 02/11 09:34
ledia:啊, 底下有人回了 XD 02/11 09:37
iamlouis:#define abs(x) (x^(x>>31)-(x>>31)) 嘿嘿嘿~ :-) 02/11 21:57
iamlouis:如果 x<0, 就是把 x XOR 0xff... 再減掉 0xff... 02/11 21:58
iamlouis:也就是 NOT x 後再減 -1 (也就是加1), 也就是二的補數. 02/11 21:59
iamlouis:如果 x>=0,則 x^0-0, 也就是 x 本身 (我跟gcc偷學的) XD 02/11 22:00
purincess:樓上這個不錯! 02/11 23:00