(C ++)查找两个整数之间的所有质数(不使用Eratosthanes筛子)

时间:2018-10-23 06:08:25

标签: c++ primes

我正在尝试查找两个整数之间的所有素数,并将它们放置在整数数组中。

要注意的是,我必须使用一种特定的方法(将每个后续整数除以数组中的所有素数)。因此,我不能使用Eratosthanes的筛子或任何其他“更简便”的方法。

我的代码成功提示用户输入两个整数,但是现在我不使用它们中的任何一个。首先,我要确保该程序适用于0到任意值之间的值,在本例中为200进行测试。

问题是,当我运行程序并打印数组中的前20个左右的值时,我得到了

2、3、5、7、11、200、0、0、0、0、0、0 ......更多零。

前5个值是正确的,因为它们始于数组,但此后整个过程变得很复杂。

我已经手工完成了嵌套循环中的几个值,它看起来像SEEMS一样有效。我觉得我要忽略一个特定的数组属性。

这是我的代码:

#include "stdafx.h"
#include "iostream"
#include "climits"
#include "cmath"
#include "array"
using namespace std;


int main()
{

// declare variables to store user input
int lowerBound, upperBound;

// prompt user for lesser and greater integers and store them
cout << "Program to find all primes between two integers." << endl;
cout << "Enter lesser integer: " << endl;
cin >> lowerBound;
cout << "Enter greater integer: " << endl;
cin >> upperBound;

// if statement to switch the input variables if the user accidentally enters them backwards
if (lowerBound > upperBound) {
    int temp = lowerBound;
    lowerBound = upperBound;
    upperBound = temp;
}

// initialize int array with the first 5 primes
int primes[100] = { 2, 3, 5, 7, 11 };

// loop to find primes between 12 and 200 (since we already have primes from 1-11 in the array)
for (int i = 12; i <= 200; i++) {

    // the maximum divisor needed to determine if the current integer being tested is prime
    double maxDivisor = sqrt(i);

    // variable for the current size of the array
    int size = 5;

    // boolean variable is set to true by default
    bool isPrime = true;

    for (int j = 0; j < size; j++) {     // changed "j<=size" to "j<size"
        int remainder = (i % primes[j]);

        // once the maximum divisor is reached, there is no need to continue testing for the current integer
        if (primes[j] > maxDivisor) {
            break;
        }

        // if the remainder of divison by a prime is 0, the number is not prime, so set the boolean variable to false
        if (remainder = 0) {
            isPrime = false;
        }
    }

    // if isPrime is still true after the nested loop, the integer value being tested will be placed in the next element of the array
    if (isPrime == true) {
        primes[size] = i;

        // since we added to the array, increment size by 1
        size++;
    }

}

// display the first 20 values in the array for debugging
for (int k = 0; k < 20; k++) {
    cout << primes[k] << ", ";
}

system("pause");
return 0;
}

1 个答案:

答案 0 :(得分:0)

这里

if (remainder = 0) {
    isPrime = false;
}

需要更改为

if (remainder == 0) {
    isPrime = false;
}

因为=进行分配,而不是进行比较。因此,remainder = 0会将remainder设置为0,然后返回0,该值被强制转换为false,这是为什么没有找到素数。

此外,正如福克斯先生指出的那样,for (int j = 0; j <= size; j++)需要更改为for (int j = 0; j < size; j++)

此外,您的编译器是否发出任何警告?如果没有,请尝试是否可以通过警告将其设置为更严格。我认为大多数现代编译器都会给您一个if (remainder = 0)的提示。从编译器获得有用的警告对防止错误很有帮助。

编辑: 正如Karsten Koop所指出的,您需要将int size = 5;从循环中移到for (int i = 12;之前。经过这些更改,它现在可以在我的机器上运行。

最后但并非最不重要的一点是:您可以只写if (isPrime == true)而不是if (isPrime)