หมายเลข Equidigital เป็นตัวเลขพิเศษทางคณิตศาสตร์ โดยจำนวนหลักในตัวเลขนั้นเท่ากับตัวเลขในการแยกตัวประกอบเฉพาะ
ในปัญหานี้ เราได้รับค่าจำนวนเต็ม n หน้าที่ของเราคือสร้างโปรแกรมสำหรับจำนวนเลขเท่ากันทั้งหมดไม่เกิน n
มาดูตัวอย่างเพื่อทำความเข้าใจปัญหากัน
ป้อนข้อมูล: n =12
ผลลัพธ์:1 2 3 5 7 10 11
แนวทางการแก้ปัญหา:
วิธีแก้ปัญหาอย่างง่ายคือการหาตัวประกอบของตัวเลขและตรวจสอบว่าจำนวนเฉพาะเท่ากับจำนวนหลักในตัวเลขนั้นหรือไม่
สามารถหาปัจจัยเฉพาะได้โดยใช้วิธีตะแกรง
อัลกอริทึม:
ขั้นตอนที่ 1: หาจำนวนเฉพาะทั้งหมด
ขั้นตอนที่ 2: นับจำนวนหลักในจำนวน n.
ขั้นตอนที่ 3: หาตัวประกอบเฉพาะของตัวเลขทั้งหมดแล้วนับจำนวนหลักในจำนวนนั้น
ขั้นตอนที่ 4: เปรียบเทียบทั้งสองค่า
ขั้นตอนที่ 5: ส่งคืนหมายเลขหากเป็นจริง
โปรแกรมเพื่อแสดงการทำงานของโซลูชันของเรา
ตัวอย่าง
#include<bits/stdc++.h>
using namespace std;
const int MAX = 10000;
vector <int> primes;
void findAllPrimes()
{
bool marked[MAX/2 + 1] = {0};
for (int i=1; i*i<= (MAX -1)/2; i++)
for (int j=(i*(i+1))<<1; j<=MAX/2; j=j+2*i+1)
marked[j] = true;
primes.push_back(2);
for (int i=1; i<=MAX/2; i++)
if (marked[i] == false)
primes.push_back(2*i + 1);
}
bool isEquidigital(int n) {
if (n == 1)
return true;
int number = n;
int digitSum = 0;
while (number > 0)
{
digitSum++;
number = number/10;
}
int primeDigits = 0 , expCount = 0, p;
for (int i = 0; primes[i] <= n/2; i++) {
while (n % primes[i] == 0) {
p = primes[i];
n = n/p;
expCount++;
}
while (p > 0) {
primeDigits++;
p = p / 10;
}
while (expCount > 1) {
primeDigits++;
expCount = expCount / 10;
}
}
if (n != 1)
{
while (n > 0)
{
primeDigits++;
n = n/10;
}
}
return (primeDigits == digitSum);
}
int main() {
findAllPrimes();
int n = 11;
cout << "Printing Equidigital Numbers less than "<<n<<" : ";
for (int i=1; i<n; i++)
if (isEquidigital(i))
cout<<i<<"\t";
return 0;
} ผลลัพธ์ -
Printing Equidigital Numbers less than 11 : 1 2 3 5 7 10 11