在 C++ 中的等位数
等位数是在这个数的质因数分解中,位数与质因数的数目相等的数学专用数字。
在这个问题中,给定一个整数 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
广告