【问题标题】:C++ question on prime numbers关于素数的 C++ 问题
【发布时间】:2010-03-08 03:09:01
【问题描述】:

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

【问题讨论】:

  • 您可能想立即添加对偶数的检查以加快 if( num % 2 == 0) 之类的速度,然后您可以让循环增加两个而不是那些。还有很多寻找素数的巧妙技巧,5 很容易,因为数字以 0 或 5 结尾,可被 3 整除的数字加起来可被 3 整除。最好的办法是消除真正的很容易先检查。
  • @Maynza 数字并不真正以 5 结尾。只是它们的十进制表示以“5”结尾。要使用这种检查,您需要首先将整数转换为字符串,或者以某种方式构建其数字列表。在这种情况下,您可以将用户输入作为字符串获取,执行这两项检查,然后将其转换为整数以进行所有其他检查。但工作量更大,不知道会不会更快。
  • 不,您不会,只需检查 (num % 10 == 5)。
  • 而不是“while (limit

标签: c++ primes


【解决方案1】:

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

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

【讨论】:

  • 你只需要检查到sqrt(n)。
  • 最简单的。同意。但是使用 Deterministic Miller-Rabin Primality check 可以大大降低复杂性。
  • @nvl:被测试的号码是int。 Miller-Rabin 是巨大的矫枉过正,我不确定它在 32 位 int 上是否更快。对于正在努力正确编写他们的第一个素数测试的人来说,一个依赖黎曼假设的算法的正确性几乎不值得一提;-)
  • @steve jessop: 嗯可能是:)。至少,他应该知道素数的形式是 6k+1、6k-1。 (~ 2,3)
【解决方案2】:
#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;
}

【讨论】:

    【解决方案3】:
    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;
    }
    

    【讨论】:

    • 这个函数认为 4、8 和 10 是素数。
    • @M Perry:哎呀,这就是我在没有测试的情况下输入代码的结果。我错过了一组括号(现已修复)。感谢您指出。
    • 它也认为 1 是素数,但是任何将 1 传递给素数检查的人都应该得到他们得到的结果。
    • @Steve:返回一个布尔值将我们限制为是/否的答案,而对于 1 并没有真正的答案——出于某些目的,将其视为素数很方便,其他则视为复合,还有一些人都不是。 “都不是”是最常见的,但不是唯一的答案。
    • 这就是我所说的“他们应该得到什么”的意思,这有点像问自然数是从 0 还是从 1 开始的。不过,我有数学学位,所以碰巧我已经接受过 1 不是素数的训练。这使得素数的定义更长,而算术基本定理的陈述更短。我记得,我从来没有见过 1 说是复合的。在环论中有“单位”的概念,它被明确排除在素数或不可约之外。不过,整数的概念几乎是退化的,因为只有两个单位(1 和 -1)。
    【解决方案4】:

    关于你的代码,你没有检查我是否输入 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;
    }
    

    【讨论】:

      【解决方案5】:

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

      【讨论】:

      • 关键是你有正确的想法,r==0 告诉你它不是素数。 . .但是,如果您在找到一些r==0 时没有停止,而是继续前进并用一些r!=0 覆盖它,那么您将放弃证明它不是质数并错误标记的证据它是素数。
      • 是的,我在停止部分遇到了麻烦。我该如何打破这一点。
      • 您几乎回答了自己的问题。查找关键字break
      • 大声笑,我知道你应该使用 break,但是,我不确定如何使用。我已经编辑了脚本,但现在它声明了所有素数 b4 它告诉你它是一个复合物。大声笑
      • 你告诉 cout 的那一行 0 时使用,这并不一定意味着它是素数,只是你试图除以它的数字没有'不均匀地进入。
      【解决方案6】:

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

      【讨论】:

        【解决方案7】:

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

        【讨论】:

          【解决方案8】:

          您好,我在没有使用 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();
                                                    }
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2021-05-15
            • 1970-01-01
            相关资源
            最近更新 更多