关于素数的C ++问题

时间:2010-03-08 03:09:01

标签: c++ primes

我正在尝试创建一个程序来确定数字是素数还是复数。到目前为止我已经到了。你能给我任何想法,以便它能运作吗?但是,所有素数都是因为复合物的值都是r> 0且r == 0,它们将始终被归类为素数。我该如何解决这个问题?

int main()
{
    int pNumber, limit, x, r;               
    limit = 2;
    x = 2;

    cout << "Please enter any positive integer: " ;
    cin >> pNumber;

    if (pNumber < 0)
    {
        cout << "Invalid. Negative Number. " << endl;
        return 0;
    }
    else if (pNumber == 0)
    {   
        cout << "Invalid. Zero has an infinite number of divisors, and therefore neither composite nor prime." << endl;
        return 0;
    }
    else if (pNumber == 1)
    {
        cout << "Valid. However, one is neither prime nor composite" << endl;
        return 0;
    }
    else
    {
        while (limit < pNumber)
        {
            r = pNumber % x;
            x++;
            limit++;

            if (r > 0)
                cout << "Your number is prime" << endl;
            else 
            {
                cout << "Your number is composite" << endl;
                return 0;
            }
        }
    }

    return 0;
}

9 个答案:

答案 0 :(得分:3)

结帐http://en.wikipedia.org/wiki/Prime_numberhttp://en.wikipedia.org/wiki/Primality_test

  

最简单的素性测试如下   如下:给定输入数n,   检查是否有任何整数m从2到   n - 1除以n。如果n可被整除   任何m然后n是复合的,否则   它是素数。

答案 1 :(得分:1)

#include <iostream>
#include <math.h>
// Checks primality of a given integer
bool IsPrime(int n)
{
    if (n == 2) return true;
    bool result = true;
    int i = 2;
    double sq = ceil(sqrt(double(n)));
    for (; i <= sq; ++i)
    {
        if (n % i == 0)
            result = false;
    }
    return result;
}
int main()
{
    std::cout << "NUMBER" << "\t" << "PRIME" << std::endl;
    for (unsigned int i = 2; i <= 20; ++i)
        std::cout << i << "\t" << (IsPrime(i)?"YES":"NO") << std::endl; 
    std::cin.get();
    return 0;
}

答案 2 :(得分:1)

bool check_prime(unsigned val) { 

    if (val == 2)
       return true;

    // otherwise, if it's even, it's not prime.
    if ((val & 1) == 0)
        return false;

    // it's not even -- only check for odd divisors.
    for (int i=3; i*i<=val; i+=2)
       if (val % i == 0)
           return false;

    return true;
}

答案 3 :(得分:1)

尊重你的代码你没有检查我是否输入2将会发生什么, 如果它是素数,你也没有返回任何东西....这就是为什么它总是返回素数,尽管数字是复合的。 这是下面的代码=&gt;

#include<iostream>
using namespace std;
int main(){
    int pNumber, limit, x, r;               
    limit = 2;
    x = 2;

    cout << "Please enter any positive integer: " ;
    cin >> pNumber;

    if (pNumber < 0){
        cout << "Invalid. Negative Number. " << endl;
        return 0;
    }
    else if (pNumber == 0){   
        cout << "Invalid. Zero has an infinite number of divisors, and therefore neither composite nor prime." << endl;
        return 0;
    }
    else if (pNumber == 1){
        cout << "Valid. However, one is neither prime nor composite" << endl;
        return 0;
    }
    else if (pNumber == 2){
        cout << " Your number is prime" << endl;
        return 0;
    }
    else{
        while (limit < pNumber){
            r = pNumber % x;
            x++;
            limit++;

            if (r > 0){
                cout << "Your number is prime" << endl;
                return 0;
            }
            else{
                cout << "Your number is composite" << endl;
                return 0;
            }
        }
    }
    return 0;
}

答案 4 :(得分:0)

首先,当你发现x pNumber % x == 0时,你会想要摆脱你的循环。您需要做的就是找到pNumber大于1且小于pNumber的一个因子来证明它不是素数 - 没有必要进一步搜索。如果你在没有找到的情况下一直到x = pNumber,那么你知道pNumber是素数。实际上,即使你找到pNumber的平方根而没有找到它,它也是素数,因为如果它有一个大于那个的因子,它应该有一个小于那个因子。合理?

答案 5 :(得分:0)

我不知道你到目前为止所教的是什么,但我的离散数学老师是Miller-Rabin test的粉丝。这是一个非常准确的测试,非常容易编码,在一些基础测试中,你有Carmichael Number的可能性非常小。如果你在学习上没有那么远,我会坚持一些基本的数字划分规则。

答案 6 :(得分:0)

最简单的方法是给定数n,如果它可以在2到sqrt(n)之间的任何数字完全可分,它是复合数,或者它的素数

答案 7 :(得分:-1)

一种方法是使用Sieving算法,例如sieve of Eratosthenes。这是一种非常快速的方法,效果非常好。

bool isPrime(int number){
  if(number == 2 || number == 3 | number == 5 || number == 7) return true;
  return ((number % 2) && (number % 3) && (number % 5) && (number % 7));
}

答案 8 :(得分:-2)

您好我已经完成了这个,也没有使用math.h头文件....已经使用了turboc编译器。 以下程序检查数字是素数还是复数。

                   #include<iostream.h>
                   #include<conio.h>
                   class prime
                             {
                                int a;
                                public:
                                     void check();

                             };
                             void prime::check()
                                                 {
                                                      cout<<"Insert a number";
                                                      cin>>a;
                                                      int count=0;
                                                      for(int i=a;i>=1;i--)
                                                         {
                                                            if(a%i==0)
                                                                    {
                                                                      count++;
                                                                     }
                                                         }
                                                             if(count==1)
                                                                      {
                                      cout<<"\nOne is neither prime nor composite";
                                                                       }
                                                             if(count>2)
                                                                       {
                                      cout<<"\nThe number is composite " ;
                                                                       }
                                                             if(count==2)
                                                                       {
                                      cout<<"\nThe numner is prime";
                                                                       }
                                 }

                                void main()
                                          {
                                            clrscr();
                                            prime k;
                                            k.check();
                                            getch();
                                          }