c++ - 查找两个区间之间的素数的函数
问题描述
我已经编写了大部分程序,我只是在调试它时遇到了麻烦。我对素数的计算一定有问题。对于我尝试的任何事情,它都说有 0 个素数。任何帮助将不胜感激。代码和输出如下。注意:对于这个程序,我不允许使用向量或数组。
#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; }}
输出(输入为 2,3)
Enter minimum and maximum:
There are 0 prime numbers in this range.
No primes to display.
解决方案
is_prime
有两个问题。
- 如果
sqrt(num)
小于 2,则循环永远不会执行,并且您的函数具有未定义的行为,因为它没有返回就结束(您的编译器可能应该警告您有关此问题) - 如果数字不是偶数,那么在您调用的循环的第一次迭代中,
return 1
这意味着所有奇数都将被标记为素数。
将循环更改为此将起作用(如果效率不高,有更好的算法来查找素数):
bool is_prime(const int num) {
for (int i = 2; i <= sqrt(num); i++) {
if (num % i == 0) {
return false;
}
}
return true;
}
推荐阅读
- javascript - 转到页面并打开模态 javascript
- php - 按查询分组适用于 php 5.4,而不是 php 7
- data-mining - 数据集市是位于数据仓库内还是在 Kimball Methodology 中完全独立的数据库?
- drake-r-package - 是否可以从动态分支目标中拆分子目标,以便以后的动态分支目标仅获得一个子子目标?
- xml - BI Publisher RTF 模板中字母数字数据的排序问题
- tensorflow2.0 - tensorflow 服务 REST API 错误:找不到可服务模型的基本路径 /models/model
- csv - Neo4j - 为参照完整性创建关系
- sql - 如何从 SQL 查询中的文本中提取数字
- ruby-on-rails - 当我尝试将表单从 React 提交到我在 Ruby on Rails 中的 API 时,我收到错误请求 400 错误
- css - 如何将宽度和高度扩展到父级?