C++ 中的节俭数
针对此问题,我们提供一个正整数 N。我们的任务是创建程序,检查给定的数字是否是一个节俭数。
节俭数 - 数字的位数严格大于给定数字质因数的位数。
示例 - 625,数字 625 的质因数为 54。
数字 625 的位数为 3。
数字 54 的位数为 2。
3 严格大于 2。因此,625 是节俭数。
前几个节俭数是 - 125、128、243、256、343、512、625 等。
让我们举一个例子来理解问题
Input: n = 128 Output: Frugal number Explanation : Factors of 128 are 2^7, number of digits 2. The number of digits in 128 is 3. The number is a frugal number.
解决方案方法
针对此问题的解决方案之一是检查当前数字 n 是否是节俭数。为此,我们将找到 n 的质因数,并计算因子中的位数,然后计算数字中的位数。如果数字中的位数大于因子中的数字,则该数字是节俭数,否则不是。
示例
用于说明我们的解决方案如何工作的程序
#include <bits/stdc++.h>
using namespace std;
vector<long int> calcPrimeNum(long int n){
bool primeNos[n + 1];
memset(primeNos, true, sizeof(primeNos));
for (int i = 2; i * i <= n; i++) {
if (primeNos[i] == true) {
for (int j = i * 2; j <= n; j += i)
primeNos[j] = false;
}
}
vector<long int> allPrimeNumbers;
for (int i = 2; i < n; i++)
if (primeNos[i])
allPrimeNumbers.push_back(i);
return allPrimeNumbers;
}
int countNumDigits(long int n){
long long int num = n;
int digitCount = 0;
while (num != 0) {
num = num / 10;
digitCount++;
}
return digitCount;
}
bool isFrugalNum(long int n){
vector<long int> primeNum = calcPrimeNum(n);
long int num = n;
long int factorDigitCount = 0;
for (int i = 0; i < primeNum.size(); i++) {
if (num % primeNum[i] == 0) {
long int k = 0;
while (num % primeNum[i] == 0) {
num = num / primeNum[i];
k++;
}
if (k == 1)
factorDigitCount = factorDigitCount + countNumDigits(primeNum[i]);
else if (k != 1)
factorDigitCount = factorDigitCount + countNumDigits(primeNum[i]) + countNumDigits(k);
}
}
return (countNumDigits(n) > factorDigitCount && factorDigitCount != 0);
}
int main(){
long int n = 625;
cout<<"The number "<<n<<" is ";isFrugalNum(n)? cout<<"a Frugal number\n" : cout << "not a Frugal number\n";
return 0;
}输出
The number 625 is a Frugal number
广告
数据结构
网络
RDBMS
操作系统
Java
iOS
HTML
CSS
安卓
Python
C 编程
C++
C#
MongoDB
MySQL
Javascript
PHP