检查一个数字是否为 Emirpimes

c++server side programmingprogramming

问题陈述包括检查一个数字是否为 Emirprimes,其中正整数 N 将是用户输入。

Emirpimes 数字是一个半素数,当数字被反转时,会给出一个新数字,该数字也是半素数。半素数是两个素数的乘积,这两个素数可以不同,也可以相同。

简而言之,对于半素数 N,它应该是 N=a*b 的形式,其中 a 和 b 是素数。它们可以相等。

在这个问题中,我们将在输入中给出一个正整数 N,我们的任务是检查给定的数字是否是 Emirpimes。

示例

让我们通过以下示例来理解问题。

输入:N=39
输出:YES

解释 - 输入中的数字是 39。对于一个数字来说,要成为 emirprimes,首先该数字本身应该是一个半素数。由于 39 可以写成 13*3,并且两者都是素数,因此它是一个半素数。

数字本身和其数字反转后形成的数字,两者都应是不同的半素数,才能成为半素数。

39 的反转是 93,它也是半素数,因为它可以写成 3 和 31 的乘积,3 和 31 是素数,并且两个数字是不同的,因此 39 是半素数。

输入:N=14
输出:NO

解释 - 数字 14 是半素数,因为它可以表示为 7 和 2 的乘积,但当其数字被反转时,它会生成一个新数字,即 41,它不是半素数,因为它已经是素数,因此不能表示为两个素数的乘积。因此,14 不是 emirpimes。

输入:N=22
输出:NO

解释 - 给定的数字 22 是半素数,因为它是两个素数即 11 和 2 的乘积。反转其数字后形成的数仅为 22。由于它没有给出新数字,因此它不是 emirpimes。

让我们了解算法,以检查数字是否是 emirpimes。

算法

我们将通过计算数字的素因数数量来简单地检查给定的数字是否是半素数。如果数字的素因数数量为 2,则该数字将是半素数,因为该数字必须是两个素数的乘积才能成为半素数。

如果数字是半素数,那么我们将通过反转数字的数字来计算新数字,然后再次检查它是否是半素数。如果它是半素数,则根据数字为 emirpimes 的条件,给定的数字是 emirpimes。

让我们看看我们方法中算法的实现,以解决在 C++ 中检查数字是否为 emirpimes 的问题。

方法

在 C++ 中实现我们方法中的算法要遵循的步骤 -

  • 我们将创建一个函数来检查数字是否是半素数。在函数中,我们将初始化一个变量来计算数字 N 的素因数的数量。

  • 我们将在 for 循环中从 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,因为它不能是 emirpimes。

  • 然后检查 N 的反转数是否等于 N,因为该数字应该是一个不同的半素数才能成为 emirpimes。如果它是一个不同的数字,那么我们将使用相同的函数检查该数字是否为半素数。

  • 如果函数返回 true,则该数字为 emirpimes。

示例

该方法的 C++ 代码 −

//C++ 代码用于检查给定数字是否为 emirpimes
#include <bits/stdc++.h>
using namespace std;

//函数用于检查数字是否为半素数
bool semiprime(int N){
    int a=0; //存储素数因子的数量
    
    //在 for 循环中迭代以检查 N 的每个素数因子
    for(int i=2;i<=sqrt(N);i++){
      if(N%i==0){
         //每次 i 除以 N 时,继续更新 N 并将计数增加 1
         while(N%i==0){
            N = N/i;
            
            a++;
         }
      }
   }
   //当 N 大于 1 且为素数时
   if(N>1){
      a++;
   }
   
   if(a==2){   //如果 N 有两个素因数,则它是半素数
      return true;
   } else {
      return false;
   }
}

//函数用于检查给定的数字是否为 emirpimes
bool emirpimes(int N){
    //如果 N 是半素数
    if(semiprime(N)==true){
    
        int rev=0; //存储具有反向数字的数字
        int num=N;
        //反转 N 的数字并存储在 rev 中
        while(num>0){
            rev = rev*10 + num%10;
            num = num/10;
        }
        //如果两个数字相等,则返回 false
        if(N==rev){
            return false;
        }
        //反转 N 的数字后形成的数字也应该是半素数
        //N 是 emirpimes
        if(semiprime(rev)){
            return true;
        }
    }
    
    //如果 N 不是半素数,则返回 false,因为它不可能是 emirpimes
    return false;
}
int main()
{
    int N; //用于获取输入
    N=122;
    //调用函数
    if(emirpimes(N)){
        cout<<N<<" 是 emirpimes"<<endl;
    } else {
        cout<<N<<" 不是 emirpimes"<<endl;
    }
    return 0;
}

输出

122 是一个 emirpimes

时间复杂度:O(sqrt(N)),检查数字是否为半素数所需的时间。

空间复杂度:O(1),因为我们没有占用任何额外空间。

结论

本文讨论了 emirpimes 数字的概念以及数字成为 emirpimes 的条件。我们在 C++ 中实现了我们方法中的条件,以检查任何数字是否是 emirpimes。

我希望您在阅读本文后理解 emirpimes 数字的概念。


相关文章