【问题标题】:C++ Prime Numbers program [closed]C++素数程序[关闭]
【发布时间】:2013-01-29 02:45:18
【问题描述】:

我正在开发一个 C++ 程序,该程序确定并打印用户输入的 3 和整数“x”之间的质数。我假设我需要一个双嵌套循环,一个从 3 迭代到 x,另一个检查数字是否为素数。我认为它需要做一些事情,比如从 2​​ 到 x-1?我只是真的不确定如何在语法方面做到这一点。谢谢你的帮助! :)

编辑: 这就是我所拥有的:

#include <iostream>
#include <cmath>

using std::cout;
using std::endl;
using std::cin;

int main(){

   int x;
   int i;
   int j;

   cout << "Please enter an integer 'x' greater than 3: " << endl;

   cin >> x;

   if (x <= 3){

        cout << "Please enter new value 'x' greater than 3: " << endl;

        cin >> x;
   }
        for(int i=3; i<=x; i++){
                for(j=2; j<i; j++){
                   if(i%j == 0)
                        break;
                   else if(i == j+1);
                        cout << i << endl;
                   }
        }
        return 0;
}

当我输入 10 作为“x”时,我得到输出: 3 5 5 5 7 7 7 7 7 9

谁能告诉我如何解决这个问题?

【问题讨论】:

  • 你应该看看 Erastothenes 的筛子。
  • 我认为你走在正确的轨道上,但你的问题并不是很好。如果它问一个非常具体的问题,例如:C++ 中循环的语法是什么,或者我是否需要嵌套循环来计算从 1 到 N 的素数或其他什么,它会更合适。此外,已经在各个地方发布了许多示例,展示了如何做到这一点,很容易访问,因此您可能只想做一些研究,然后再询问您是否仍然感到困惑。
  • 到目前为止您尝试过什么?您是否在这里搜索过与同一主题相关的其他问题?
  • 修复代码的最小编辑:hpaste.org/81471。考虑在codereview.stackexchange.com 上发布此类问题。

标签: c++ primes


【解决方案1】:

如果您的X 足够小,您可以使用埃拉托色尼筛来更有效地完成此操作。这对于“素数达到 X”的情况是理想的,因为它保留了以前丢弃的素数的内存。它通过为每个候选编号保留一组标志来做到这一点,所有这些标志最初都设置为 true(当然除了 1)。

然后取第一个真值 (2),将其作为素数输出,然后将其所有倍数的标志设置为假。

然后继续:

  • 3;
  • 5(因为 4 是 2 的倍数);
  • 7(因为 6 是 2 和 3 的倍数);
  • 11(因为 8 和 10 是 2 的倍数,而 9 是 3 的倍数);
  • 13(因为 12 是 2 的倍数);
  • 17(因为 14 和 16 是 2 的倍数,而 15 是 3 和 5 的倍数);
  • 等等。

伪代码类似于:

def showPrimesUpTo (num):
    // create array of all true values

    array isPrime[2..num] = true

    // start with 2 and go until finished

    currNum = 2
    while currNum <= num:
        // if prime, output it

        if isPrime[currNum]:
            output currNum

            // also flag all multiples as nonprime

            clearNum = currNum * 2
            while clearNum <= num:
                isprime[clearNum] = false
                clearNum = clearNum + currNum

        // advance to next candidate

        currNum = currNum + 1

否则,您可以根据您的建议进行试划分。基本思想是检查从 2 到目标数字平方根的每个数字,看看它是否是倍数。在伪代码中,这将是这样的:

def isPrime (num):
    // val is the value to check for factor

    val = 2

    // only need to check so far

    while val * val <= num:
        // check if an exact multiple

        if int (num / val) * val == num:
            return false

        // no, carry on

        val = val + 1

    // if no factors found, it is a prime

    return true

你只需要检查平方根的原因是,如果你在上面找到一个因子,你就会在平方根下面找到相应的因子

例如,3 x 1751。如果您检查从 2 到 50 的数字以查看 51 是否为素数,您会首先找到 3,这意味着您永远不需要检查 17

【讨论】:

    【解决方案2】:
    int main (char argv) 
    {
        int tempNum = atoi(argv);
        for (int i=3; i<=tempNum; i++) 
            for (int j=2; j*j<=i; j++)
            {
                if (i % j == 0) 
                    break;
                else if (j+1 > sqrt(i)) {
                    cout << i << " ";
    
                }
    
            }   
    
        return 0;
    }
    

    Printing prime numbers from 1 through 100 基本上是这样,但修改了

    【讨论】:

    • 您检查了每个j &lt;= sqrt(i)j+1 &gt; sqrt(i) 测试,但它只能成功一次,即最后一个。另外,您真正的意思是您是否因break 而退出循环。所以最好让 that 在你的代码中明显。 :) 您可以使用附加的 flag 变量或GOTO 来执行此操作,例如this here.
    【解决方案3】:

    我发现这个非常快速高效

     int main(){
        for(int i=3; i<=X; i++)    
                if(IsPrime(i)){
                   cout<<i<<endl;
                }
        }
    
     bool IsPrime(int num){
        /* use commented part if want from 2
            if(num<=1)
    
                return false;
    
            if(num==2)
    
                return true;
        */
            if(num%2==0)
    
                return false;
    
            int sRoot = sqrt(num*1.0);
    
            for(int i=3; i<=sRoot; i+=2)
    
            {
    
                if(num%i==0)
    
                    return false;
    
            }
    
            return true;
        }
    

    【讨论】:

    • 那么你必须只做小的素数。
    • @LokiAstari 没找到你?在什么参考?如果上面的代码有任何缺陷?请提出建议。
    • 这不是有效的:它的 O(n^2),因此只对小素数有用。在此技术之上有几个很好的优化,使其更加高效。但你真的想要Sieve of Eratosthenes
    • @LokiAstari 非常感谢 .. 一定会寻找的
    • 在搜索Sieve of Eratosthenes 时发现sieve of AtkinsSieve of Eratosthenes
    猜你喜欢
    • 2012-11-04
    • 2023-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多