2

我正在尝试制作一个程序来确定数字是素数还是合数。到目前为止,我已经得到了。你能给我一些想法让它起作用吗?但是,所有素数都会 ,因为复合物的值都是 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;
}
4

8 回答 8

3

查看http://en.wikipedia.org/wiki/Prime_numberhttp://en.wikipedia.org/wiki/Primality_test

最简单的素性检验如下:给定一个输入数 n,检查从 2 到 n-1 的任何整数 m 是否能整除 n。如果 n 可以被任何 m 整除,则 n 是合数,否则它是素数。

于 2010-03-08T03:13:05.770 回答
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;
}
于 2010-03-08T04:41:28.793 回答
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;
}
于 2010-03-08T04:49:03.993 回答
1

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

#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;
}
于 2015-11-28T15:39:50.813 回答
0

最简单的方法是对于给定的数字 n ,如果它可以被 2 到 sqrt(n) 之间的任何数字完全整除,它是一个复合数,或者它的素数

于 2010-03-08T21:50:56.697 回答
0

一方面,当你找到某个xwhere时,你会想跳出你的循环pNumber % x == 0。您需要做的就是找到一个pNumber大于 1 且小于 1的因数pNumber来证明它不是质数——进一步搜索没有意义。如果你一直到x = pNumber没有找到一个,那么你就知道pNumber是素数。实际上,即使你没有找到一个平方根pNumber,它也是素数,因为如果它有一个大于那个的因子,它应该有一个小于那个的因子。说得通?

于 2010-03-08T03:20:26.393 回答
0

我不知道到目前为止你学到了什么,但我的离散数学老师是Miller-Rabin 测试的粉丝。这是一个非常准确的测试,非常容易编码,在几个基本测试中,你有一个非常微不足道的机会,你有一个Carmichael Number。如果你的学习还没有那么远,我会坚持一些基本的数字除法规则。

于 2010-03-08T03:32:17.603 回答
-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();
                                          }
于 2012-10-29T15:21:03.683 回答