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

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 ?.

Bạn muốn hỏi gì? Ý tưởng hay nhờ code hộ?

2 Likes

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.

1 Like

(|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

2 Likes

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/

1 Like

Đơ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))
1 Like

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ớ :hocho: :hocho:


cho cast boolean thì có thể làm được: bool(a/b) * a + bool(b/a) * b ơ mà a == b thì toang

Chia nguyên mà, code đây nhé: Python: https://ideone.com/x9dti0
C: https://ideone.com/nMxE4p

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 :hocho:

ảo ma hơn nữa code chạy vẫn đúng à :hocho:

ơ 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ớ :hocho:
bớ đả đảo tên gió, từ chức leader đi :boom: :boom: :boom:

1 Like

\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 :hocho: 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 :hocho:

4 posts were merged into an existing topic: Topic lưu trữ các post off-topic - version 3

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

1 Like

Floor division a // b của Python là

math.floor(a / b)

Nguồn: @mouse

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