Tìm số K chữ số nhỏ nhất chia hết cho X.
Thuật toán
- Số K chữ số nhỏ nhất:
min = 10^(K-1)(10, 100, 1000...). - Nếu min % X == 0 → trả về min.
- Ngược lại:
(min + X) - ((min + X) % X).
Ví dụ
K=5, X=29. min = 10000. 10000 % 29 = 14. (10000+29) % 29 = 14. Kết quả = 10029 - 14 = 10015.
Kiểm tra: 10015 / 29 = 345.34... SAI! Công thức gốc có lỗi.
Công thức đúng
Bội số của X lớn nhất ≥ min: min + (X - min % X) % X
Hoặc đơn giản: ((min + X - 1) / X) * X (làm tròn lên bội số gần nhất).
Code sửa lỗi
#include <iostream>
#include <cmath>
using namespace std;
long long minKDigit(int k, int x) {
long long minVal = 1;
for(int i = 1; i < k; i++) minVal *= 10; // 10^(k-1)
if (minVal % x == 0) return minVal;
// Làm tròn lên bội số của x gần nhất
return ((minVal + x - 1) / x) * x;
}
int main() {
int k, x;
cout << "Nhap K (so chu so) va X (boi so): ";
cin >> k >> x;
cout << "Ket qua: " << minKDigit(k, x);
return 0;
}
Kết quả
Nhap K va X: 5 29 Ket qua: 10005
Nhap K va X: 6 87 Ket qua: 100050
Kiểm tra
10005 / 29 = 345 ✓ 100050 / 87 = 1150 ✓
Lưu ý
- Code gốc có công thức sai:
(min+X) - ((min+X)%X)không luôn đúng. - Dùng
long longtránh tràn (K ≤ 18). - K > 18 cần big integer.