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

3 Likes

Cả chương trình chỉ được phép có 1 dòng code?

printf("%d", (a + b) / 2 + abs(a - b) / 2);

3 Likes

((a + b) / 2 + abs(a-b) / 2)
or
max(a, b) with ‘algorithm’ library included =))

2 Likes

1 dòng code là cái dòng xử lý đó anh

1 Like

(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

2 Likes

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 :joy: 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ả: :joy:
return b * ((a - b) >> 31 & 1) + a * (~(a - b) >> 31 & 1);

6 Likes

Nếu là 3 số thì làm như thế nào vậy mọi người

1 Like

Bạn kéo lên các cmt trên, có câu trả lời ở đó nhé :smile:

83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?