[spoiler]Nhớ làm mờ câu trả lời của mình[/spoiler]
Nguồn: @btm
Gợi ý: Áp dụng 1 chút kiến thức toán lớp 4
P/S: Code viết trên 1 dòng, kết thúc ở dấu ;
đầu tiên
[spoiler]Nhớ làm mờ câu trả lời của mình[/spoiler]
Nguồn: @btm
Gợi ý: Áp dụng 1 chút kiến thức toán lớp 4
P/S: Code viết trên 1 dòng, kết thúc ở dấu ;
đầu tiên
Cả chương trình chỉ được phép có 1 dòng code?
printf("%d", (a + b) / 2 + abs(a - b) / 2);
((a + b) / 2 + abs(a-b) / 2)
or
max(a, b)
with ‘algorithm’ library included =))
1 dòng code là cái dòng xử lý đó anh
(a+ b) + trị tuyệt đối ( a - b ), tất cả chia 2;
Tổng quát đây bạn =)) bao nhiêu số cũng đc
ko if else thì đơn giản dễ hiểu là
return a * (a > b) + b * (b > a);
tức là nếu a > b thì a > b trả về 1, nhân với a ra a, b > a trả về 0, nhân với b ra 0. Tổng a + 0 = a.
nhưng cách này bị mắc lỗi trả về 0 khi a == b, nên phải sửa lại là
return a * (a > b) + b * (b >= a);
nhưng viết như vậy hơi xấu vì phải xài >=
, ta có thể sửa lại chỉ xài dấu <
:
return b * (a < b) + a * !(a < b);
nếu thích bỏ so sánh a < b
thì có thể chuyển thành a - b
và xét dấu của giá trị a-b này. Nếu a < b thì a-b trả về số âm, và dấu là 1. Trùng với a < b
trả về 1 khi a bé hơn b luôn. Cách lấy dấu của 1 số 32-bit n
có nhiều cách, mình xài cách viết ngắn gọn là (n >> 31) & 1
hay có thể viết là n >> 31 & 1
: nếu bit dấu là 1 thì n>>31
sẽ dịch bit này về bit đầu tiên, rồi ta trích chỉ 1 bit đầu tiên của 1 số ra bằng cách lấy x&1
.
vậy b * (a < b)
viết lại thành b * ((a - b) >> 31 & 1)
. Còn !(a < b)
thì ta chỉ cần đảo bit của a-b
là được. Ko lấy b-a
vì nếu lấy b-a thì nó trở thành b < a, sẽ cho ra kết quả 0. Đảo bit sẽ cho ra kết quả đúng: nếu a==b thì a-b = 0, ~(a-b) sẽ cho bit dấu cao nhất thành số 1.
kết quả:
return b * ((a - b) >> 31 & 1) + a * (~(a - b) >> 31 & 1);
Nếu là 3 số thì làm như thế nào vậy mọi người
Bạn kéo lên các cmt trên, có câu trả lời ở đó nhé