检查数字是否是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,则可以说它是完美的力量;否则,它就是完美的力量。最后,在最后一步,我们可以得出结论,如果给定的数字很强而没有完善的能力,那么该数字将被视为Trojan Number。

示例

// CPP program to check if a number is

//特洛伊木马号

#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;

}

//驱动程式码

int main(){

   int n1 = 72;

   if (isTrojan1(n1))

      cout << "YES";

   else

      cout << "NO";

   return 0;

}

输出结果

Yes

以上是 检查数字是否是C ++中的特洛伊木马数字 的全部内容, 来源链接: utcz.com/z/345368.html

回到顶部