Pandigital Number - ในคณิตศาสตร์ Pandigital number คือจำนวนเต็มที่ในฐานที่กำหนดมีหลักสำคัญแต่ละหลักใช้ตัวเลขในฐานนั้นอย่างน้อยหนึ่งครั้ง
Pandigital numbers คือจำนวนเต็มที่แต่ละหลักถูกใช้เป็นฐานอย่างน้อยหนึ่งครั้ง
ตัวเช่น 1245678 เป็น pandigital number
วิธีการแก้ปัญหา
- รับอินพุตตัวเลขและฐาน (base)
- ตรวจสอบฐานถ้ามันน้อยกว่า 2 และมากกว่า 10 ให้คืนค่า 1 มิฉะนั้นตรวจสอบตัวเลขว่ามันเป็น pandigital หรือไม่
- ฟังก์ชัน Integer is_pandigital(long long n, int base) รับตัวเลขและฐานเป็นอินพุต
- นับสำหรับทุกหลักที่มีอยู่ในตัวเลขและเพิ่มจำนวนนับ
- วนลูปผ่านทุกหลักเพื่อดูว่ามีหลักว่างหรือไม่ ถ้ามีให้คืนค่า false
- ฟังก์ชัน Integer is_zeroless (long long n, int base) รับอินพุตและตัวเลขและฐานเป็นอินพุตและคืนค่าถ้าพบหลัก
- วนลูปผ่านทุกหลัก หากมีหลักใดว่าง จะคืนค่า 0
- สุดท้าย ฟังก์ชัน check_number(long long number, int base) รับตัวเลขและฐานเป็นอินพุต ฟังก์ชันคืนค่า 1 ถ้าพบ มิฉะนั้น 0
ตัวอย่างโค้ด
#include <iostream>
using namespace std;
int is_pandigital(long long number, int base);
int is_zeroless_pandigital(long long number, int base);
int check_number(long long number, int base);
int main() {
long long number;
int base;
cout << "Enter a number: ";
cin >> number;
cout << "Enter Base: ";
cin >> base;
if (base < 2 || base > 10) {
return 1;
}
if (check_number(number, base)) {
if (is_pandigital(number, base)) {
cout << number << " is a pandigital number in base " << base;
} else {
cout << number << " is not a pandigital number in base " << base;
}
if (is_zeroless_pandigital(number, base)) {
cout << number << " is a zeroless pandigital number in base " << base;
} else {
cout << number << " is not a zeroless pandigital number in base " << base;
}
} else {
cout << number << " is not a valid number in base " << base;
}
return 0;
}
int is_pandigital(long long number, int base) {
int digits[10], i;
memset(digits, 0, sizeof(int) * 10);
while (number > 0) {
int digit = number % 10;
++digits[digit];
number /= 10;
}
for (i = 0; i < base; ++i)
if (digits[i] == 0)
return 0;
return 1;
}
int is_zeroless_pandigital(long long number, int base) {
int digits[10], i;
memset(digits, 0, sizeof(int) * 10);
while (number > 0) {
int digit = number % 10;
if (digit == 0) return 0;
++digits[digit];
number /= 10;
}
for (i = 1; i < base; ++i)
if (digits[i] == 0)
return 0;
return 1;
}
int check_number(long long number, int base) {
while (number > 0) {
int digit = number % 10;
if (digit > base - 1) return 0;
number /= 10;
}
return 1;
}
ผลลัพธ์
Enter a number: 45 Enter base(min:2 to max-10): 10 45 is not a valid number.