使用 C++ 检查数字是否为特洛伊数字
概念
对于给定的数字 n,任务是验证 n 是否为特洛伊数字。特洛伊数字定义为一个强数字,但不是完全幂。我们可以说,如果数字 n 的每个素数除数或因子 p,p^2 也是除数,则 n 被视为强数字。换句话说,每个素数因子至少出现两次。我们应该记住,所有特洛伊数字都是强数字。但反之则不成立,这意味着,并非所有强数字都是特洛伊数字:只有那些不能表示为 a^b 的数字,其中 a 和 b 是大于 1 的正整数。
输入
n = 72 72 is expressed as 6×6×2 i.e. (6^2)×2 i.e. Strong Number but without perfect power.
输出
YES
输入
n = 16 16 is expressed as 2×2×2×2 i.e. 2^4 i.e. Strong number with perfect power.
输出
NO
方法
首先,我们必须存储每个素数因子的计数,并验证如果计数大于 2,则它将是一个强数字。
在下一步中,我们必须验证给定数字是否表示为 a^b。如果它不能表示为 a^b,我们可以说它不是完全幂;否则它是完全幂。最后,在最后一步,我们可以得出结论,如果这个给定的数字是强数字且不是完全幂,则该数字被视为特洛伊数字。
示例
// CPP program to check if a number is // Trojan Number or not #include <bits/stdc++.h> using namespace std; bool isPerfectPower1(int n1){ if (n1 == 1) return true; for (int x1 = 2; x1 <= sqrt(n1); x1++) { int y1 = 2; int p1 = pow(x1, y1); while (p1 <= n1 && p1 > 0) { if (p1 == n1) return true; y1++; p1 = pow(x1, y1); } } return false; } bool isStrongNumber1(int n1){ unordered_map<int, int> count1; while (n1 % 2 == 0) { n1 = n1 / 2; count1[2]++; } for (int i1 = 3; i1 <= sqrt(n1); i1 += 2) { while (n1 % i1 == 0) { n1 = n1 / i1; count1[i1]++; } } if (n1 > 2) count1[n1]++; int flag1 = 0; for (auto b : count1) { if (b.second == 1) { flag1 = 1; break; } } if (flag1 == 1) return false; else return true; } bool isTrojan1(int n1){ if (!isPerfectPower1(n1) && isStrongNumber1(n1)) return true; else return false; } // Driver Code int main(){ int n1 = 72; if (isTrojan1(n1)) cout << "YES"; else cout << "NO"; return 0; }
输出
Yes
广告