Chỉ dùng các toán tử “+ , - , * , /” mà không dùng các toán tử so sánh để tìm ra số lớn nhất giữa 2 số nguyên a , b ?.
Chỉ dùng các toán tử cộng trừ nhân chia mà không dùng các toán tử so sánh để tìm ra số lớn nhất giữa 2 số nguyên
Bạn muốn hỏi gì? Ý tưởng hay nhờ code hộ?
Mathematics is the shortest way to solve a problem and get a satisfactory result. If you only try to use the 4 basic calculations to solve a mathematical equation, you have not only lengthened the path but also created more problems for yourself
What do you study? In Computer Science, in the US and Europe, we have learned the subject of “Problem Oriented Programming Language” – or in simple terms, Compiler Technology. Remember that computers can only perform the following operations:
- Addition
- Shifts and
- Inversion.
The other calculations like Sub, Mul, Div and Comparisons have to be implemented based on the mentioned operations.
If you know how to multiply or divide 2 binary numbers of 32 bits, you can solve your own question with ease.
(|a - b| + (a + b)) / 2
giải thik
if a > b -> |a - b| = a - b + a + b = 2a / 2 = a
if b > a -> |a - b| = b - a + a + b = 2b / 2 = b
Cho mình xin cái mã giả đi bạn ?
Ý tưởng ban đầu là \frac{1}{2}((x-y)\cdot \text{sign}(x-y)+(x+y))
Nhưng hàm \text{sign} này không viết lại bằng 4 phép tính được.
Câu hỏi này thật ra còn có 1 cái vấn đề chưa rõ. Nếu không dùng so sánh, vậy thì có thể dùng if/else/loop hoặc hàm khác được không?
Còn về gợi ý, bạn có thể kiểm tra https://en.wikipedia.org/wiki/Negative_flag
And for Joe message:
What kind of splitting is this? You are using multiple parts from multiple abstraction layers man. That make more confusion than help. If you want simplify, just need to say, anything from computer is just NAND, and others are based on that: https://www.nand2tetris.org/
Đơn giản mà, dựa vào tính chia nguyên ta có thể xây dựng hàm f(a,b)
trả về 1
nếu a > b
hoặc ngược lại là 0
như sau:
f = lambda a, b: (b-a + 0.1) // (b - a + 0.2)
- Nếu b >= a: 0 < tử < mẫu kết quả = 0
- Nếu a > b: a - b = n với n > 0 nên f = (n - 0.1) / (n - 0.2) = 1
Khi đó hàm max được tính bằng:
mx = lambda a,b: f(a,b) * a + f(b,a) * b + a * (1- f(a,b) - f(b,a))
# phần sau để TH 2 số = nhau (f(a,b) = f(b,a) = 0)
Test
f = lambda a, b: (b-a + 0.1) // (b-a + 0.2)
mx = lambda a,b: f(a,b) * a + f(b,a) * b + a * (1- f(a,b) - f(b,a))
for i in range(-10, 10):
for j in range(-10, 10):
t1 = mx(i,j)
t2 = max(i,j)
assert t1==t2
print(f(i, j))
Why don’t you go deeper into the circuit level with ON and OFF?
ơ dỏm rồi f = (n + 0.1) / (n + 0.2)
+0.1 và +0.2 mà đâu ra -0.1 -0.2, dù a>b hay a<b hay a=b thì tử vẫn < mẫu chớ
cho cast boolean thì có thể làm được: bool(a/b) * a + bool(b/a) * b
ơ mà a == b thì toang
hoang đường vậy (b-a+0.1) luôn luôn < (b-a+0.2) mà
ví dụ -1 thì tử = -0.9 < mẫu là -0.8, 1 thì tử là 1.1 < mẫu là 1.2
lý luận ở trên từ cộng thành trừ ảo ma vậy
ảo ma hơn nữa code chạy vẫn đúng à
ơ nếu cast biến bool là ra rồi đâu cần +0.1 0.2 gì bool(a/b)*a + bool(b/a)*b - (bool(a/b)*a + bool(b/a)*b - 1) * b
ơ ví dụ -2 < -1 ai cho nhân -1 để ra 2 < 1, tên gió lừa đảo bớ
bớ đả đảo tên gió, từ chức leader đi
\text{đặt } a - b = n > 0 \\ f = \dfrac{b-a + 0.1}{b-a + 0.2} = \dfrac{-n + 0.1}{-n + 0.2} = \dfrac{n-0.1}{n-0.2}
thì bằng như -2 / -1 = 2 / 1 nhưng -2 < -1 đâu có nghĩa là 2 < 1 trời nhân -1 cho 2 vế phải đảo < > toán cấp 1 trời ban ngay tên leader này
TH 1 a <= b
\text{đặt } b - a = m \geq 0 \\ f = \dfrac{b-a + 0.1}{b-a + 0.2} = \dfrac{m + 0.1}{m + 0.2} < 1 \implies f=0
TH 2 a > b
\text{đặt } a - b = n > 0 \\ f = \dfrac{b-a + 0.1}{b-a + 0.2} = \dfrac{-n + 0.1}{-n + 0.2} = \dfrac{n-0.1}{n-0.2} \implies f = 1