30/09/2018, 23:22
Tìm số lớn nhất trong 2 số không dùng If else, Switch case, toán tử quan hệ, toán tử 3 ngôi
[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
Bài liên quan
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ànha - 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ớia < b
trả về 1 khi a bé hơn b luôn. Cách lấy dấu của 1 số 32-bitn
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ấyx&1
.vậy
b * (a < b)
viết lại thànhb * ((a - b) >> 31 & 1)
. Còn!(a < b)
thì ta chỉ cần đảo bit củaa-b
là được. Ko lấyb-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é