确定数字是否为素数

时间:2010-12-12 22:11:31

标签: c++ algorithm primes

我已经在这个主题上仔细阅读了很多代码,但是大多数代码都生成了一直到输入数字为止的数字。但是,我需要的代码只检查给定的输入数是否为素数。

这是我能够写的,但它不起作用:

void primenumber(int number)
{
    if(number%2!=0)
      cout<<"Number is prime:"<<endl;
    else 
      cout<<"number is NOt prime"<<endl;
}

如果有人能就如何正常工作给我建议,我将不胜感激。

更新

我修改它以检查for循环中的所有数字。

void primenumber(int number)
{
    for(int i=1; i<number; i++)
    {
       if(number%i!=0)
          cout<<"Number is prime:"<<endl;
       else 
          cout<<"number is NOt prime"<<endl;
    }  
}

21 个答案:

答案 0 :(得分:35)

bool isPrime(int number){

    if(number < 2) return false;
    if(number == 2) return true;
    if(number % 2 == 0) return false;
    for(int i=3; (i*i)<=number; i+=2){
        if(number % i == 0 ) return false;
    }
    return true;

}

答案 1 :(得分:33)

我自己的IsPrime()函数,基于着名的Rabin-Miller算法的确定性变体编写,结合优化的步骤强制执行,为您提供最快的主要测试功能之一。

__int64 power(int a, int n, int mod)
{
 __int64 power=a,result=1;

 while(n)
 {
  if(n&1) 
   result=(result*power)%mod;
  power=(power*power)%mod;
  n>>=1;
 }
 return result;
}

bool witness(int a, int n)
{
 int t,u,i;
 __int64 prev,curr;

 u=n/2;
 t=1;
 while(!(u&1))
 {
  u/=2;
  ++t;
 }

 prev=power(a,u,n);
 for(i=1;i<=t;++i)
 {
  curr=(prev*prev)%n;
  if((curr==1)&&(prev!=1)&&(prev!=n-1)) 
   return true;
  prev=curr;
 }
 if(curr!=1) 
  return true;
 return false;
}

inline bool IsPrime( int number )
{
 if ( ( (!(number & 1)) && number != 2 ) || (number < 2) || (number % 3 == 0 && number != 3) )
  return (false);

 if(number<1373653)
 {
  for( int k = 1; 36*k*k-12*k < number;++k)
  if ( (number % (6*k+1) == 0) || (number % (6*k-1) == 0) )
   return (false);

  return true;
 }

 if(number < 9080191)
 {
  if(witness(31,number)) return false;
  if(witness(73,number)) return false;
  return true;
 }


 if(witness(2,number)) return false;
 if(witness(7,number)) return false;
 if(witness(61,number)) return false;
 return true;

 /*WARNING: Algorithm deterministic only for numbers < 4,759,123,141 (unsigned int's max is 4294967296)
   if n < 1,373,653, it is enough to test a = 2 and 3.
   if n < 9,080,191, it is enough to test a = 31 and 73.
   if n < 4,759,123,141, it is enough to test a = 2, 7, and 61.
   if n < 2,152,302,898,747, it is enough to test a = 2, 3, 5, 7, and 11.
   if n < 3,474,749,660,383, it is enough to test a = 2, 3, 5, 7, 11, and 13.
   if n < 341,550,071,728,321, it is enough to test a = 2, 3, 5, 7, 11, 13, and 17.*/
}

使用,复制并粘贴代码到程序顶部。调用它,它返回一个BOOL值,无论是真还是假。

if(IsPrime(number))
{
    cout << "It's prime";
}

else
{
    cout<<"It's composite";
}

如果您在使用“__int64”进行编译时遇到问题,请将其替换为“long”。它在VS2008和VS2010下编译得很好。

工作原理: 该功能有三个部分。部分检查它是否是极少数例外(负数,1)之一,并拦截程序的运行。

如果数字小于1373653,则第二部分开始,这是理论上Rabin Miller算法将击败我的优化强力函数的数字。接下来是两个级别的拉宾米勒,旨在尽量减少所需证人的数量。由于您将要测试的大多数数字都在40亿以下,因此通过检查见证人2,7和61可以使概率性Rabin-Miller算法具有确定性。如果您需要超过40亿的上限,则需要大量数字库,并对power()函数应用模数或位移修改。

如果你坚持使用蛮力方法,这里只是我优化的蛮力IsPrime()函数:

inline bool IsPrime( int number )
{
 if ( ( (!(number & 1)) && number != 2 ) || (number < 2) || (number % 3 == 0 && number != 3) )
  return (false);

 for( int k = 1; 36*k*k-12*k < number;++k)
  if ( (number % (6*k+1) == 0) || (number % (6*k-1) == 0) )
   return (false);
  return true;
 }
}

这个暴力作品如何运作: 所有素数(除了2和3)都可以用6k + 1或6k-1的形式表示,其中k是正整数。此代码使用此事实,并以比所讨论数字的平方根小6k + 1或6k-1的形式测试所有数字。这件作品已集成到我的大型IsPrime()函数中(首先显示的功能)。

如果您需要查找数字下方的所有素数,请查找1000以下的所有素数,查看Eratosthenes的Sieve。我的另一个最爱。

另外需要注意的是,我希望看到有人实现Eliptical Curve Method算法,一直希望看到用C ++实现一段时间,我失去了它的实现。从理论上讲,它甚至比我实施的确定性Rabin Miller算法更快,尽管我不确定这对40亿以下的数字是否正确。

答案 2 :(得分:13)

你需要做更多的检查。现在,你只是检查这个数字是否可以被2整除。对于2,3,4,5,6,......同样为number。提示:使用循环

解决此问题后,请尝试查找优化。 提示:您只需要检查所有数字,直到数字的平方根

答案 3 :(得分:5)

如果(输入%number!= 0)返回false,我猜想将sqrt和foreach从2运行到sqrt + 1; 一旦达到sqrt + 1,你就可以确定它的最佳状态。

答案 4 :(得分:3)

<强> C ++

bool isPrime(int number){
    if (number != 2){
        if (number < 2 || number % 2 == 0) {
            return false;
        }
        for(int i=3; (i*i)<=number; i+=2){
            if(number % i == 0 ){
                return false;
            }
        }
    }
    return true;
}

<强>的Javascript

function isPrime(number)
{
    if (number !== 2) {
        if (number < 2 || number % 2 === 0) {
            return false;
        }
        for (var i=3; (i*i)<=number; i+=2)
        {
            if (number % 2 === 0){
                return false;
            }
        }
    }
    return true;
}

<强>的Python

def isPrime(number):
    if (number != 2):
        if (number < 2 or number % 2 == 0):
            return False
        i = 3
        while (i*i) <= number:
            if(number % i == 0 ):
                return False;
            i += 2
    return True;

答案 5 :(得分:3)

如果您知道输入的范围(由于函数采用int而执行),您可以预先计算小于或等于最大输入的平方根的素数表(2 ^ 31在这种情况下为-1),然后通过表中每个素数小于或等于给定数字的平方根来测试可分性。

答案 6 :(得分:3)

bool check_prime(int num) {
    for (int i = num - 1; i > 1; i--) {
        if ((num % i) == 0)
            return false;
    }
    return true;
}

检查任何数字(如果是素数

答案 7 :(得分:2)

使用数学首先找到数字的平方根然后开始循环,直到数字结束后你得到平方根。 检查每个值是否给定的数字是否可被迭代值整除。如果任何值除以给定的数字,则它不是素数,否则为素数。 这是代码

 bool is_Prime(int n)
 {

   int square_root = sqrt(n); // use math.h
   int toggle = 1;
   for(int i = 2; i <= square_root; i++)
   {
     if(n%i==0)
     { 
        toggle = 0;
        break;
     }
   }

   if(toggle)
     return true;
   else
     return false;

 } 

答案 8 :(得分:2)

我遵循相同的算法但不同的实现循环到sqrt(n),步骤2只有奇数,因为我检查它是否可以被2或2 * k整除它是假的。这是我的代码

public class PrimeTest {

    public static boolean isPrime(int i) {
        if (i < 2) {
            return false;
        } else if (i % 2 == 0 && i != 2) {
            return false;
        } else {
            for (int j = 3; j <= Math.sqrt(i); j = j + 2) {
                if (i % j == 0) {
                    return false;
                }
            }
            return true;
        }
    }

    /**
     * @param args
     */
    public static void main(String[] args) {
        for (int i = 1; i < 100; i++) {
            if (isPrime(i)) {
                System.out.println(i);
            }
        }
    }

}

答案 9 :(得分:2)

如果你很懒,并且拥有大量内存,请创建一个sieve of Eratosthenes,这实际上是一个巨大的阵列,你可以从中踢出所有不是素数的数字。 从那时起,每次素数“概率”测试都会非常快速。 此解决方案的快速结果的上限是RAM的数量。超低结果的此解决方案的上限是您的硬盘容量。

答案 10 :(得分:2)

此代码仅检查该数字是否可被2整除。对于一个数字是素数,它不能被所有小于其自身的整数整除。这可以通过检查它是否可被循环中小于floor(sqrt(n))的所有整数整除来实现。如果您有兴趣,则存在一些much faster algorithms

答案 11 :(得分:1)

上面有人有以下内容。

bool check_prime(int num) {
for (int i = num - 1; i > 1; i--) {
    if ((num % i) == 0)
        return false;
}
return true;
}

这大部分都有效。我刚刚在Visual Studio 2017中测试过它。它会说小于2的任何东西也是素数(所以1,0,-1等)

这是一个稍作修改来纠正这个问题。

bool check_prime(int number)
{
    if (number > 1)
    {
        for (int i = number - 1; i > 1; i--)
        {
            if ((number % i) == 0)
                return false;
        }
        return true;
    }
    return false;
}

答案 12 :(得分:0)

这个问题有几种不同的方法 “朴素”方法:尝试所有(奇数)数字,直到数字的根(。) 改进的“天真”方法:每6n±1只尝试一次 概率测试:Miller-Rabin,Solovay-Strasse等。

哪种方法适合您,以及您使用素数做什么 您至少应该阅读Primality Testing

答案 13 :(得分:0)

如果n为2,那就是素数。

如果n为1,则不是素数。

如果n是偶数,则不是素数。

如果n是奇数,大于2,我们必须检查所有奇数3..sqrt(n)+1,如果这个数字中的任何一个可以除n,n不是素数,否则,n是素数。

为了获得更好的性能,我建议使用eratosthenes筛。

以下是代码示例:

<from uri="quartz2://processTimers?cron=5+*+*+*+*+*" />
<to uri="mybatis:selectProducts?statementType=SelectList&amp;onConsume=consumeProduct"/>
<bean ref="productService" method="process" />
<to uri="mq:queue:my.queue"/>

答案 14 :(得分:0)

我想出了这个:

int counter = 0;

bool checkPrime(int x) {
   for (int y = x; y > 0; y--){
      if (x%y == 0) {
         counter++;
      }
   }
   if (counter == 2) {
      counter = 0; //resets counter for next input
      return true; //if its only divisible by two numbers (itself and one) its a prime
   }
   else counter = 0;
        return false;
}

答案 15 :(得分:0)

I Have Use This Idea For Finding If The No. Is Prime or Not:

#include <conio.h> 
#include <iostream>
using namespace std;
int main() {
  int x, a;
  cout << "Enter The No. :";
  cin >> x;
  int prime(unsigned int);
  a = prime(x);
  if (a == 1)
    cout << "It Is A Prime No." << endl;
  else
  if (a == 0)
    cout << "It Is Composite No." << endl;
  getch();
}

int prime(unsigned int x) {
  if (x == 1) {
    cout << "It Is Neither Prime Nor Composite";
    return 2;
  }
  if (x == 2 || x == 3 || x == 5 || x == 7)
    return 1;
  if (x % 2 != 0 && x % 3 != 0 && x % 5 != 0 && x % 7 != 0)
    return 1;
  else
    return 0;
}

答案 16 :(得分:0)

这是一种快速有效的方法:

bool isPrimeNumber(int n) {
    int divider = 2;
    while (n % divider != 0) {
        divider++;
    }
    if (n == divider) {
        return true;
    }
    else {
        return false;
    }
}

它将开始查找n的整数,从2开始。一旦找到一个整数,如果该数字等于n,则它是质数,否则就不是。

答案 17 :(得分:0)

//simple function to determine if a number is a prime number
//to state if it is a prime number


#include <iostream>

using namespace std;


int isPrime(int x);  //functioned defined after int main()


int main()
{
 int y;
    cout<<"enter value"<<endl;

    cin>>y;

    isPrime(y);    

  return 0;

 } //end of main function


//-------------function

  int isPrime(int x)
 {
   int counter =0;
     cout<<"factors of "<<x<<" are "<<"\n\n";    //print factors of the number

     for (int i =0; i<=x; i++)

     {
       for (int j =0; j<=x; j++)

         {
           if (i * j == x)      //check if the number has multiples;
                {

                  cout<<i<<" ,  ";  //output provided for the reader to see the
                                    // muliples
                  ++counter;        //counts the number of factors

                 }


          }


    }
  cout<<"\n\n";

  if(counter>2) 
     { 
      cout<<"value is not a prime number"<<"\n\n";
     }

  if(counter<=2)
     {
       cout<<"value is a prime number"<<endl;
     }
 }

答案 18 :(得分:0)

   bool isPrime(int n)
   {
       if(n==1) return false;
       if(n==2 || n==3) return true;
       if(n%2==0 || n%3==0) return false;
       for(int i=5;i*i<=n;i=i+6)
           if(n%i==0 || n%(i+2)==0)
               return false;
       return true;        
      
    }

答案 19 :(得分:-1)

#define TRUE 1
#define FALSE -1

int main()
{
/* Local variables declaration */
int num = 0;
int result = 0;

/* Getting number from user for which max prime quadruplet value is 
to be found */
printf("\nEnter the number :");
scanf("%d", &num);

result = Is_Prime( num );

/* Printing the result to standard output */
if (TRUE == result)
    printf("\n%d is a prime number\n", num);
else
    printf("\n%d is not a prime number\n", num);

return 0;
}

int Is_Prime( int num )
{
int i = 0;

/* Checking whether number is negative. If num is negative, making
it positive */
if( 0 > num )
    num = -num;

/* Checking whether number is less than 2 */
if( 2 > num )
    return FALSE;

/* Checking if number is 2 */
if( 2 == num )
    return TRUE;

/* Checking whether number is even. Even numbers
are not prime numbers */
if( 0 == ( num % 2 ))
    return FALSE;

/* Checking whether the number is divisible by a smaller number
1 += 2, is done to skip checking divisibility by even numbers.
Iteration reduced to half */
for( i = 3; i < num; i += 2 )
    if( 0 == ( num % i ))
        /* Number is divisible by some smaller number, 
        hence not a prime number */
        return FALSE;

return TRUE;
}

答案 20 :(得分:-3)

if(number%2!=0)
      cout<<"Number is prime:"<<endl;

代码非常错误。 33除以2是16,提醒1但它不是素数...

相关问题