素数嵌套循环逻辑

时间:2015-12-15 05:10:19

标签: c++ c++11 primes

我目前正致力于下面所述的任务。我的问题是为什么我的代码只重复素数为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;
}

4 个答案:

答案 0 :(得分:2)

琐碎的方法很容易理解。

  1. 外循环(假设此处的循环变量为num)从2到10000,并检查每个数字是否为素数。

  2. 内部循环(假设此处的循环变量为fact)通过表单2到num - 1

  3. 根据num检查fact是否有[{1}}因子。如果num % fact == 0fact的因子,则打破内循环并继续检查下一个数字。

  4. 如果检查了从2到num的所有数字并且其中没有一个是num - 1因子,那么我们确定num是素数并继续检查下一个号码。

  5. 请注意,0和1是特殊情况,因此我们将它们从循环中排除。

    这种方法不需要任何数组。时间复杂度为O(n 2 ),空间复杂度为O(1)。

    BTW,还有其他更好的解决方案,例如Sieve of Eratosthenes

答案 1 :(得分:1)

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

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]

答案 2 :(得分:1)

了解循环的目的

  • 外部循环是提供数字的那个,因此你 不需要矢量

  • 内部循环是进行检查的内容

你在哪里打印?

  • 内循环检查数字是否 prime。唯一的方法吧 知道这是因为外环提供的数字可被内环提供的任何数字整除。因此内循环 没有打印任何东西,因为它必须在它知道数字为素数之前耗尽所有检查

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

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

答案 3 :(得分:0)

不需要遍历内循环的整个范围,对于内循环,可能的值从2开始到&lt; =那个数字/ 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;
}