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
Bài liên quan
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.
Đâ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.
a phải chạy từ 1 —> 9 chứ nhỉ ?? Đó là số hàng trăm mà ??
Một chút toán học:
1, Tìm nghiệm 1 cách xấu xí:
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
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: