使用 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

更新於: 2020-07-23

79 次瀏覽

開啟您的 職業生涯

透過完成課程獲得認證

開始學習
廣告

© . All rights reserved.