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

Đỗ Trung Quân viết 01:34 ngày 01/10/2018

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

chichi viết 01:31 ngày 01/10/2018

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

X viết 01:37 ngày 01/10/2018

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

Người bí ẩn viết 01:29 ngày 01/10/2018

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

Trí Hoàng viết 01:24 ngày 01/10/2018

(a+ b) + trị tuyệt đối ( a - b ), tất cả chia 2;

Ai Android viết 01:26 ngày 01/10/2018

nhập vào 3 số nguyên dương, xuất ra giá trị lớn nhất, giá trị nhỏ nhất. KHÔNG dùng các cấu trúc điều kiện rẽ nhánh, không dùng sort (thực ra cũng chứa if) ,... Nói tóm lại chỉ dùng các phép toán

Tổng quát đây bạn =)) bao nhiêu số cũng đc

viết 01:37 ngày 01/10/2018

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);

Jonas Khánh viết 01:29 ngày 01/10/2018

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

HK boy viết 01:39 ngày 01/10/2018

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

Bài liên quan
0