
Digits Product
Cho số tự nhiên product
Hãy tìm số nguyên dương nhỏ nhất (lớn hơn 0
) mà tích các chữ số của số đó bằng product
. Nếu không có số thỏa mãn, trả ra -1
.
Ví dụ
- Với
product = 12
, thì kết quảdigitsProduct(product) = 26;
- Với
product = 19
, thì kết quảdigitsProduct(product) = -1.
Đầu vào/đầu ra:
- [Thời gian chạy] 0.5 giây
- [Đầu vào] integer product
Điều kiện:0 ≤ product ≤ 600.
- [Đầu ra] integer
Gợi ý:
- Chọn các chữ số của số cần tìm là ước số của
product
- Các chữ số lớn ở phía sau, các chữ số nhỏ ở phía trước (Ví dụ
129
thay vì921
)
Lý thuyết :
- Số
A
nhỏ hơn sốB
khi :- số chữ số của
A
ít hơn số chữ số củaB
- số chữ số của
A
bằng củaB
, và vị trí đầu tiên (từ trái sang) khác nhau của 2 số, chữ số củaA
có giá trị bé hơn
- số chữ số của
- Vậy, để thu được số nhỏ nhất, ta cần tối ưu về số lượng chữ số, rồi sau đó là thứ tự các chữ số
- Ta lấy theo cách sau : lấy chữ số to nhất lớn hơn 1 mà
product
chia hết, đặt ở cuối, rồi tiếp tục làm thế vớiproduct
mới (sau khi đã chia cho chữ số đó)- TH1 :
product = 1
⇒ Ta đã tách đượcproduct
thành mọi chữ số, nên sẽ có kết quả cho bài toán - TH2 :
product > 1
. Lúc nàyproduct
sẽ gồm các số nguyên tố >9
, nên ko còn cách nào có thể tách ra nữa. Ko có số nào thỏa mãn đề bài trong trường hợp này
- TH1 :
- Tính đúng đắn :
- Giá trị ta tách ra càng to, thì càng tách ra ít lần. Nên số chữ số chắc chắn là tối ưu nhất
- Giả sử có nhiều cách tách ra có cùng số chữ số, thì việc tách ra chữ số càng to, sẽ càng tốt hơn cho phần ở trước
- Ví dụ :
product = 108
⇒9 * 6 * 2
⇒ kết quả :269
- Ta nên lấy
{ 9, 6, 2 }
thay vì{ 2, 2, 3, 3, 3 }
để tối ưu về số chữ số - Ta nên lấy
{ 9, 6, 2 }
thay vì{ 9, 4, 3 }
vì sau khi lấy6
, product còn lại là2
thay vì3
. Và2
tốt hơn khi đặt ở hàng đầu tiên (từ trái sang)
- Ta nên lấy
- Ta lấy theo cách sau : lấy chữ số to nhất lớn hơn 1 mà
- Bài toán tương tự : Cho số
product
. Tìm số có tổng các chữ số nhỏ nhất. Nếu có nhiều số thỏa mãn, in ra số bé nhất.
Hướng dẫn bài tập.
Để kết quả là bé nhất ta phải đảm bảo rằng:
- kết quả ít chữ số nhất có thể, ví dụ
3233
ta có thể thay thế bằng69
. - Các số của kết quả sắp xếp không giảm.
Nên ta số lần lượt chia product
cho các số từ 9
đến 2
.
Lưu ý: bài này có một số trường hợp đặc biệt.
Code mẫu:
Ngôn ngữ C++:
int digitsProduct(int product)
{
if (product == 1) return 1;
if (product == 0) return 10;
int ans = 0;
for (int i = 9; i >= 2; i--){
while(product % i == 0){
ans = ans * 10 + i;
product /= i;
}
}
// số ans bây giờ là kết quả, nhưng nó đang bị ngược.
int ans2 = 0;
while (ans > 0){
ans2 = ans2 * 10 + ans % 10;
ans /= 10;
}
return (product == 1) ? ans2 : -1;
}
Post Comment