01/10/2018, 16:40

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

Songtotnhe viết 18:50 ngày 01/10/2018

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.

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

đó 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.

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

in tất cả các số abc gồm 3 chữ số

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

[a,b,c] = [0,0,0]; [1,2,3]; [1,3,2]; [2,1,3]; [2,3,1]; [3,1,2]; [3,2,1]

Đụng a = 0 rồi.

Nguyễn Đình Anh viết 18:56 ngày 01/10/2018

Cho a chạy từ 0 đến giới hạn của a,

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

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

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

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

wolframalpha.com

Wolfram|Alpha: Making the world’s knowledge computable

Wolfram|Alpha brings expert-level knowledge and capabilities to the broadest possible range of people—spanning all professions and education levels.

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

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, , loại.

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

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

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

-> 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
Bài liên quan
0