我正在尝试查找两个整数之间的所有素数,并将它们放置在整数数组中。
要注意的是,我必须使用一种特定的方法(将每个后续整数除以数组中的所有素数)。因此,我不能使用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;
}
答案 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)
。