Số Pandigital là số nguyên mà trong cơ số cho trước (base), mỗi chữ số từ 0 đến base-1 xuất hiện ít nhất một lần. Ví dụ: 1245678 là pandigital cơ số 10 (chứa 0-9? thực ra thiếu 0,3,9 - ví dụ gốc có lỗi).
Số zeroless pandigital không chứa chữ số 0, chỉ yêu cầu 1..base-1 xuất hiện ít nhất một lần.
Phương pháp
- Kiểm tra cơ số hợp lệ (2..10).
- Hàm
check_number: đảm bảo mọi chữ số của số đều < base. - Hàm
is_pandigital: đếm tần suất chữ số, kiểm tra 0..base-1 đều xuất hiện ≥1 lần. - Hàm
is_zeroless_pandigital: tương tự nhưng bỏ qua 0, kiểm tra 1..base-1.
Ví dụ mã nguồn
#include <iostream>
#include <cstring>
using namespace std;
bool is_pandigital(long long n, int base) {
int cnt[10] = {0};
while (n > 0) { cnt[n%10]++; n/=10; }
for (int i = 0; i < base; i++) if (cnt[i]==0) return false;
return true;
}
bool is_zeroless_pandigital(long long n, int base) {
int cnt[10] = {0};
while (n > 0) {
int d = n%10;
if (d==0) return false;
cnt[d]++;
n/=10;
}
for (int i = 1; i < base; i++) if (cnt[i]==0) return false;
return true;
}
bool check_number(long long n, int base) {
while (n > 0) { if (n%10 >= base) return false; n/=10; }
return true;
}
int main() {
long long num; int base;
cout << "Nhap so: "; cin >> num;
cout << "Nhap co so (2-10): "; cin >> base;
if (base < 2 || base > 10) return 1;
if (!check_number(num, base)) {
cout << num << " khong hop le trong co so " << base;
return 0;
}
if (is_pandigital(num, base)) cout << num << " la pandigital co so " << base;
else cout << num << " KHONG la pandigital co so " << base;
cout << endl;
if (is_zeroless_pandigital(num, base)) cout << num << " la zeroless pandigital co so " << base;
else cout << num << " KHONG la zeroless pandigital co so " << base;
return 0;
}
Kết quả mẫu
Nhap so: 45 Nhap co so (2-10): 10 45 KHONG la pandigital co so 10 45 KHONG la zeroless pandigital co so 10