嵌套循环导致奇怪的结果

时间:2014-02-04 19:10:09

标签: c++

我正在研究一个问题,以便找到2到100之间的素数。我的想法是:

1: Create a list of odd numbers up to 100

2: Use a nested loop to try and divide each number in the list

3: If the number is divisible, mark as -1 in the list (not a prime)

4: Print out all numbers that are not equal to -1

我知道有更有效的方法来找到这些素数,但我现在不在乎。 当我在嵌套循环中到达i == 4时,它似乎被分配到-1,其中我期望该值是下一个奇数(9)。我不明白为什么会这样。这是我写的代码:

#ifndef EX10
#define EX10
#include <iostream>
#include <vector>
using namespace std;

class Ex10
{
public:
    void Go()
    {
        vector<int> vecNums;
        vecNums.push_back(2);

        // Get all our test numbers.
        for(int i = 3; i < 100; ++i)
        {
            if(i % 2 == 1)
            {
                vecNums.push_back(i);
            }
        }

        cout << "Numbers filled" << endl;

        // Loop through dividing numbers
        for(int i = 0; i < vecNums.size(); ++i)
        {
            if(i == 4)
            {
                cout << "i " << vecNums[i] << endl; // Why is this -1?
            }
            for(int j = i+1; j < vecNums.size(); ++j)
            {
                if(vecNums[j] % vecNums[i] == 0 && vecNums[j] != -1)
                {
                    //cout << "i " << vecNums[i] << endl;
                    //cout << "j " << vecNums[j] << endl;
                    //not a prime
                    vecNums[j] = -1;
                }
            }
        }

        cout << "Primes found" << endl;

        for(int i = 0; i < vecNums.size(); ++i)
        {
            if(vecNums[i] != -1)
            {
                cout << vecNums[i] << endl;
            }
        }
    }
};

#endif

提前致谢!

2 个答案:

答案 0 :(得分:0)

-1i == 2时,它已更改为j == 4

答案 1 :(得分:0)

嗯,9不是素数。所以它在你的循环中第一次被设置为-1,就像它应该的那样。

if(vecNums[j] % vecNums[i] == 0 && vecNums[j] != -1) 在第一次通过你的外循环进入内循环的第四次迭代 if(vecNums[4] % vecNums[1] == 0 && vecNums[4] != -1) 评估为 if(9 % 3 == 0 && 9 != -1)

但是,你应该小心,因为一旦你在列表中得到-1,你就会做模数-1。这会给你带来难以置信的结果。如果vecNums [i] == -1

,则不需要运行内循环