【问题标题】:Prime number nested loop Logic素数嵌套循环逻辑
【发布时间】:2015-12-15 05:10:18
【问题描述】:

我目前正在处理如下所述的任务。我的问题是,为什么我的代码只将质数重复为 2 而不是其余数字。如果有人可以帮助我了解逻辑,我将不胜感激,这样我就可以尝试解决解决方案,而不是直接发布答案。向所有人致敬:)

编写一个使用两个嵌套 for 循环和模数的程序 运算符 (%) 检测并打印从 1 到 10,000 的素数。 (素数是不能被整除的自然数 除了他们自己和一个以外的任何其他数字)。显示所有 找到素数。

#include <iostream>
#include <vector>

using namespace std;

int main() {
    vector<int> n; // will store our values from 1-10000

    for (int i= 0; i < 10000; i++) { // vector loading
       n.push_back(i);
       n[i]= n[i] + 1;

       for (int j= 1; j < 10000  ; j++ ) { // Error is here?
           if (n[j] % j == 0) { // supposed to go through all the numbers 
                                // and flag the prime numbers
               cout<<n[i]  <<" is a prime";
               i++;
               break;
            }
        }
    }

    return 0;
}

【问题讨论】:

  • 考虑使用iterator
  • 这段代码有几个问题。您是否尝试过添加一些诊断 cout 语句并迭代到 10 条?

标签: c++ c++11 primes


【解决方案1】:

简单的方法比较容易理解。

  1. 外循环(假设这里的循环变量为num)从2到10000,检查每个数是否为质数。

  2. 内循环(假设这里的循环变量是fact)从形式2到num - 1

  3. 通过num % fact == 0 检查num 是否有因子fact。如果factnum 的一个因子,则中断内循环并继续检查下一个数字。

  4. 如果在检查了从 2 到 num - 1 的所有数字后,没有一个是 num 的因数,那么我们确定 num 是一个质数,并继续检查下一个数字。

请注意,0 和 1 是特殊情况,因此我们将它们排除在循环之外。

此方法不需要任何数组。时间复杂度为O(n2),空间复杂度为O(1)。

顺便说一句,这个问题还有其他更好的解决方案,例如Sieve of Eratosthenes

【讨论】:

    【解决方案2】:

    有几个问题,但首先考虑第一个循环。

    i = 0
    n.push_back(i);       // Now n[0] is now valid (having the value 0)
    n[0] = n[0] + 1;      // Now n[0] is still valid (having the value 1)
    j = 1;
    if (n[j] % j == 0)    // Ups... access to n[1] which is invalid
                          // as you have only pushed one element, i.e. n[0]
    

    【讨论】:

      【解决方案3】:

      了解循环的目的

      • 外部循环是提供数字的循环,因此您 不需要向量

      • 内部循环是执行检查的循环

      您在哪里打印?

      • 内部循环检查一个数是否不是素数。唯一的办法 知道这是如果外部循环提供的数字不可被内部循环提供的任何数字整除。因此内循环 不打印任何内容,因为它必须在知道一个数字是素数之前用尽所有检查

      • 您的打印声明应该排在最后。这意味着它应该在内部循环之后但仍然在外部循环内部,并且如果它是基于内部循环发现的内容的素数,它应该打印数字。所以你应该有办法知道内部循环是否找到了一个素数

      最后请注意,内部循环必须从 2 开始并在 i - 1 结束,因为每个数字都可以被 1 和它自己整除

      【讨论】:

        【解决方案4】:

        内循环不需要遍历整个范围,对于内循环,可能的值是从2开始到。

        如果你想检查 99 是否是素数,那么你需要 将内部循环设置为 2 到 49(99 / 2 是 该数字)所以不要遍历其余所有内容。

        因此,如果您将内部循环从 2 迭代到 98,那么它的意义就更小了 49之后迭代这个循环,想想吧。

        #include <iostream>
        #include <vector>
        
        using namespace std;
        
        int main()
        {
            //vector<int> n; // will store our values from 1-10000
            int flag  =0;
            for (int i= 2; i < 10000; i++) // vector loading
            {
                //n.push_back(i);
                //n[i]= n[i] + 1;
                flag  =0;
                for (int j= 2; j <= i / 2  ; j++ ) 
                {
                    if (i % j == 0)             
                    {
                        flag = 1;
                        break;
                    }
        
                }
                if(flag == 0)
                {
                    cout << "%d number is Prime" << i;
                }
            }
        return 0;
        }
        

        【讨论】:

        • 我更新了条件内循环必须是
        • 这并不重要,但您可能希望外部循环从 2 而不是 0 开始。
        • 那么你是对的,不需要去检查0和1的条件。
        • 重点是 0 和 1 不是素数,所以当你从 0 开始时,结果实际上是不正确的,因为 0 和 1 会被错误地打印为素数
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-11-14
        • 2016-02-25
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多