Xin ý tưởng giải bài tập

Chào mọi người, em đang có 1 bài tập khá khó hiểu:
Đề: Viết chương trình in tất cả các số abc gồm 3 chữ số, thoả mãn (a+b+c) = a.b.c
Ví dụ 3 số 1 2 3 thoả mản được yêu cầu: (1+2+3) = 1.2.3

Em đã tìm được tất cả các số thoả mãn là [a,b,c] = [0,0,0]; [1,2,3]; [1,3,2]; [2,1,3]; [2,3,1]; [3,1,2]; [3,2,1] nhưng không biết làm các nào để biên dịch ra bằng ngôn ngữ lập trình.

Mọi người cho em ý tưởng để giải bài này với ạ, em cám ơn

Trước tiên thì, mình nghĩ là đề thiếu một thông tin quan trọng (hoặc bạn ghi thiếu đề), đó là giới hạn của a, b, c (ví dụ a, b, c đều < 10), vì nếu không có giới hạn thì tìm đến tận thế cũng chưa hết.

Có giới hạn của a, b, c rồi, thì ta có thể dùng cách đơn giản nhất là 3 dòng for.
Cho a chạy từ 0 đến giới hạn của a,
Cho b chạy từ 0 đến giới hạn của b,
Cho c chạy từ 0 đến giới hạn của c,

Ở mỗi cặp [a, b, c] ta kiểm tra xem a+b+c có bằng a.b.c hay không, nếu có thì thêm nó vào mảng kết quả (hoặc in ra màn hình luôn).

Đó là cách đơn giản nhất, làm được bằng cách này đi rồi tìm hướng tối ưu sau.

3 Likes

Đâu cần thiết hả bạn. Đề đã nói là

tức là bạn phải tự hiểu 0 <= a, b, c < 10, a != 0 rồi.

Đụng a = 0 rồi.

5 Likes

a phải chạy từ 1 —> 9 chứ nhỉ ?? Đó là số hàng trăm mà ??

3 Likes

Một chút toán học:

1, Tìm nghiệm 1 cách xấu xí:

tuy nhiên, khỏi cần search cũng dễ dàng suy ra :grin:

Loại bớt các khả năng không phù hợp với điều kiện, ta chỉ còn khả năng a >= 1, b != 1/a, c = (a+b) / (ab - 1)

Vì vai trò của a, b, c như nhau nên nếu 1 số bằng 0 thì 2 số còn lại sẽ là đối của nhau -> không được. Do vậy, a, b, c đều lớn hơn 0 hết.

2, c là số nguyên -> c = (a+b) / (ab - 1) là số nguyên. Chưa nói đến tính chia hết, để c nguyên được thì a + b >= ab - 1 đã.

Biến đổi tương đương

(a+b) >= (ab - 1)
<=> ab - a - b - 1 <= 0
<=> (a - 1)(b - 1) <= 2

Vì a, b đều nguyên -> (a - 1), (b - 1) nguyên -> vế trái nguyên. Theo a, b, c > 0 -> a, b, c >= 1 -> vế trái >= 0. Xảy ra 3 trường hợp:

  • (a - 1)(b - 1) = 0 -> a = b = 1 -> loại vì b phải khác 1/a.

  • (a - 1)(b - 1) = 1 -> a - 1 = b - 1 = 1 -> a = b = 2 -> c = (2 + 2) / (2*2 - 1) = 4/3, :boom:, loại.

  • (a - 1)(b - 1) = 2 ->

  • a - 1 = 1, b - 1 = 2 -> a = 2, b = 3 -> c = (2 + 3) / (2*3 - 1) = 1, :ok:.

  • a - 1 = 2, b - 1 = 1 -> a = 3, b = 2 -> c = (3 + 2) / (3*2 - 1) = 1, :ok:.

-> 2 bộ nghiệm rút ra được là (2, 3, 1) hoặc (3, 2, 1), tuy nhiên vai trò của a, b, c như nhau nên (a, b, c) thuộc { hoán vị của (1, 2, 3) }


Code:

print(123, 213, ...)  # in hết hoán vị bằng tay chứ code gì nữa cho mệt
8 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?