C++ 在两个区间之间查找素数的函数
我已经写了大部分程序,只是调试有困难。我对素数的计算一定出了问题。无论我尝试什么,它都说有0个素数。任何帮助都将不胜感激。代码和输出如下。 注意:对于这个程序,我不允许使用向量或数组C++ 在两个区间之间查找素数的函数,c++,C++,我已经写了大部分程序,只是调试有困难。我对素数的计算一定出了问题。无论我尝试什么,它都说有0个素数。任何帮助都将不胜感激。代码和输出如下。 注意:对于这个程序,我不允许使用向量或数组 #include <iostream> #include <cmath> using namespace std; // FUNCTION PROTOTYPE FOR read_range void read_range(int &lower, int &upper
#include <iostream>
#include <cmath>
using namespace std;
// FUNCTION PROTOTYPE FOR read_range
void read_range(int &lower, int &upper);
// FUNCTION PROTOTYPE FOR is_prime
bool is_prime(const int num);
// FUNCTION PROTOTYPE FOR display_primes
void display_primes(const string &prime, const int lower, const int upper);
// DO NOT MODIFY THE MAIN ROUTINE IN ANY WAY
int main()
{
int imin(0), imax(0);
// Read in range
read_range(imin, imax);
// Print prime numbers
cout << endl;
display_primes("Primes: ", imin, imax);
return 0;
}
// DEFINE FUNCTION read_range() HERE:
void read_range(int &lower, int &upper){
cout << "Enter minimum and maximum: ";
cin >> lower >> upper;
while (lower < 2 || upper < 2 || lower > upper){
if (lower < 2 || upper < 2) {
cout << "Error. Minimum and maximum must be at least 2." << endl; }
else if (lower > upper) {
cout << "Error. Minimum must be less than maximum." << endl; }
cout << "Enter minimum and maximum: ";
cin >> lower >> upper; }}
// DEFINE FUNCTION is_prime() HERE:
bool is_prime(const int num) {
for (int i = 2; i <= sqrt(num); i++) {
if (num % i == 0) {
return 0; } // Is not prime
else {
return 1; }}} // Is prime
// DEFINE FUNCTION display_primes() HERE:
void display_primes(const string &prime, const int lower, const int upper) {
int count = 0;
int commaCheck = 0;
for (int i = lower; i <= upper; i++) {
if (is_prime(i)) {
count = count + 1; }}
if (count == 1) {
cout << "There is " << count << " prime number in this range." << endl; }
else {
cout << "There are " << count << " prime numbers in this range." << endl; }
if (count != 0) {
cout << prime;
for (int i = lower; i <= upper; i++) {
if (is_prime(i)) {
if (count == 1) {
cout << i;}
else {
commaCheck = commaCheck + 1; }
if (commaCheck != count) {
cout << i << ","; }
else {
cout << i; }}}
cout << endl; }
else {
cout << "No primes to display." << endl; }}
is_prime有两个问题
如果sqrtnum小于2,则循环永远不会执行,并且函数在结束时没有返回编译器,因此函数具有未定义的行为,可能应该警告您此问题
如果数字不是偶数,那么在循环的第一次迭代中,您调用return1,这意味着所有奇数都将被标记为素数。
如果不是很有效,将循环更改为该循环将起作用,有更好的算法用于查找素数:
bool is_prime(const int num) {
for (int i = 2; i <= sqrt(num); i++) {
if (num % i == 0) {
return false;
}
}
return true;
}
这是检查两个区间之间有多少个数字是素数的默认算法之一,有很多选择,但这是我喜欢的,而且很短,很容易记住
#include <iostream>
using namespace std;
int main(){
int i1min, i1max;
int i, j, k = 0;
bool primeTest;
cin >> i1min;
cin >> i1max;
for(i=i1min; i<=i1max; i++) {
primeTest = false;
for (j=2; j<=i/2; j++) {
if (i % j == 0) {
primeTest = true;
break;
}
}
if (primeTest == false)
k++;
}
cout << k;
return 0;
}
这里的这条线是i=2的_素数;i sqrt2和2>sqrt3-因此循环不会对传入的范围执行。另外,如果UB-无法从非void函数返回值,编译器通常可以检查您的警告级别。您可能希望将sqrtnum存储到一个常量临时变量中,这样它就不会在每次迭代中执行。@Thomasmatthew还有很多其他低效率,可能不会有太大区别
#include <iostream>
using namespace std;
int main(){
int i1min, i1max;
int i, j, k = 0;
bool primeTest;
cin >> i1min;
cin >> i1max;
for(i=i1min; i<=i1max; i++) {
primeTest = false;
for (j=2; j<=i/2; j++) {
if (i % j == 0) {
primeTest = true;
break;
}
}
if (primeTest == false)
k++;
}
cout << k;
return 0;
}