等位数数字是数学上特殊的数字,其中数字中的位数等于其素数分解中的数字。
在这个问题上,我们得到一个整数n。我们的任务是创建一个程序,以处理所有等于n的等位数数字。
输入: n = 12
输出:1 2 3 5 7 10 11
解决该问题的一种简单方法是找到数字的因数,并检查素数的数量是否等于数字中的位数。
主要因素可以使用筛子法找到。
步骤1: 找到所有素数。
步骤2: 计算数字n中的数字位数。
步骤3: 找到该数字的所有素数,并计算其中的位数。
步骤4: 比较两个值。
步骤5: 如果为true,则返回数字。
#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 << "打印等值数字小于 "<<n<<" : "; for (int i=1; i<n; i++) if (isEquidigital(i)) cout<<i<<"\t"; return 0; }
打印等值数字小于 11 : 1 2 3 5 7 10 11