檢查一個數是否為Emirpimes數


問題陳述包括檢查一個數是否為Emirprimes數,其中正整數N將作為使用者輸入。

Emirpimes數是一個半素數,當其數字被反轉時,會得到一個新的數,該數也是一個半素數。半素數是一個數,它是兩個素數的乘積,這兩個素數可以相同也可以不同。

簡單來說,對於一個數N要成為半素數,它必須是N=a*b的形式,其中a和b是素數。它們可以相等。

在這個問題中,我們將得到一個正整數N作為輸入,我們的任務是檢查給定的數是否為Emirpimes數。

示例

讓我們透過以下示例來理解這個問題。

INPUT : N=39
OUTPUT : Yes

說明 - 輸入中的數是39。對於一個數要成為Emirprimes數,首先它本身必須是一個半素數。由於39可以寫成13*3,並且兩者都是素數,因此它是一個半素數。

它本身和由其數字反轉形成的數,都必須是不同的半素數才能成為Emirprimes數。

39的反轉數是93,它也是一個半素數,因為它可以寫成3和31的乘積,這兩個數都是素數,並且這兩個數是不同的,因此39是一個Emirprimes數。

INPUT : N=14
OUTPUT : No

說明 - 數14是一個半素數,因為它可以表示為7和2的乘積,但是當它的數字被反轉時,會得到一個新數,即41,它不是一個半素數,因為它本身就是一個素數,因此它不能表示為兩個素數的乘積。因此,14不是一個Emirprimes數。

INPUT : N=22
OUTPUT : No

說明 - 給定的數22是一個半素數,因為它是由兩個素數的乘積,即11和2。由其數字反轉形成的數仍然是22。由於它沒有得到一個新數,因此它不是一個Emirprimes數。

讓我們瞭解一下演算法,以便檢查一個數是否為Emirpimes數。

演算法

我們將簡單地透過計算該數的素因子數來檢查給定的數是否為半素數。如果該數的素因子數為2,則該數將是半素數,因為該數必須是兩個素數的乘積才能成為半素數。

如果該數是半素數,那麼我們將透過反轉該數的數字來計算新數,然後再次檢查它是否為半素數。如果它是一個半素數,那麼根據一個數成為Emirprimes數的條件,給定的數就是Emirprimes數。

讓我們看看在我們的方法中演算法的實現,以便解決用C++檢查一個數是否為Emirpimes數的問題。

方法

在我們的C++方法中實現演算法需要遵循的步驟:

  • 我們將建立一個函式來檢查一個數是否為半素數。在函式中,我們將初始化一個變數來計算數N的素因子數。

  • 我們將從i=2迭代到i<=sqrt(N),並檢查N是否能被i整除。如果i能整除N,則在巢狀的while迴圈中迭代,直到i能整除N,並不斷更新N,同時在每次迭代中將素因子計數增加1。

  • 現在,檢查N是否大於1,以應對N大於1的素數的情況,這種情況在上述操作中無法變成1,因此我們將計數增加1。

  • 如果素因子計數等於1,則該數是半素數。

  • 如果N是半素數,我們將反轉N的數字,如果N不是半素數,我們將返回false,因為它不可能是Emirprimes數。

  • 然後檢查N的反轉數是否等於N,因為該數必須是一個不同的半素數才能成為Emirprimes數。如果它是一個不同的數,那麼我們將使用相同的函式檢查它是否為半素數。

  • 如果函式返回true,則該數是Emirprimes數。

示例

C++程式碼如下:

//C++ code to check if the given number is an emirpimes or not
#include <bits/stdc++.h>
using namespace std;

//function to check if the number is a semiprime or not
bool semiprime(int N){
   int a=0; //to store the count of number of prime factors
   
   //iterating in a for loop to check for every prime factor of N
   for(int i=2;i<=sqrt(N);i++){ 
      if(N%i==0){
         //keep updating N and increase count by 1 every time i divides N
         while(N%i==0){
            N = N/i;
            
            a++;
         }
      }
   }
   //for the case when N is greater than 1 and is a prime number
   if(N>1){
      a++;
   }
   
   if(a==2){   //if N has two prime factors, it is a semiprime
      return true;
   } else {
      return false;
   }
}

//function to check if the given number is an emirpimes or not
bool emirpimes(int N){
   //if N is a semiprime
   if(semiprime(N)==true){
      
      int rev=0; //to store the number with reverse digits
      int num=N;
      //reverse the digits of N and store in rev
      while(num>0){
         rev = rev*10 + num%10;
         num = num/10;
      }
      //if both the numbers are equal then return false
      if(N==rev){
         return false;
      }
      //the number formed by reversing the digits of N should also be semiprime
      //for N to be emirpimes
      if(semiprime(rev)){
         return true;
      }
   }
   
   //if N is not a semiprime then return false as it can't be an emirpimes
   return false;
}
int main()
{
   int N; //for taking the input
   N=122;
   //calling the function
   if(emirpimes(N)){
      cout<<N<<" is an emirpimes"<<endl;
   } else {
      cout<<N<<" is not an emirpimes"<<endl;
   }
   return 0;
}

輸出

122 is an emirpimes

時間複雜度:O(sqrt(N)),檢查一個數是否為半素數所需的時間。

空間複雜度:O(1),因為我們沒有佔用任何額外的空間。

結論

本文討論了Emirpimes數的概念以及一個數成為Emirprimes數的條件。我們在C++方法中實現了這些條件,以檢查任何一個數是否為Emirprimes數。

希望閱讀完本文後,您能理解Emirprimes數的概念。

更新於: 2023年6月21日

196 次檢視

開啟您的職業生涯

透過完成課程獲得認證

開始學習
廣告
© . All rights reserved.