使用两个函数在c++中显示小于或等于输入的素数

Displaying prime numbers less than or equal to input in c++ using two functions

本文关键字:于输入 输入 小于 两个 函数 c++ 显示      更新时间:2023-10-16

我需要创建一个c++程序,显示小于或等于输入值的所有素数。问题是(我似乎无法做到的部分),我必须使用两个函数来做到这一点,并且我不能在确定它们是否是素数的同一个函数中输出值。下面是两个方案,第一个是一个不工作的方案,这是我在意识到第二个方案不符合要求后,通过反复试验得出的结论。第二种方案有效,但不满足上述要求。提前谢谢你,这已经快把我逼疯了。

First:

 bool is_Prime(int);
    #include <iostream>
    using namespace std;
    int main() {
        int m, n;
        n = 2;
        cout << "Your input: ";
        cin >> m;
        cout << "The prime numbers less than or equal to " << m << " are:" << endl;
        while ( n <= m)
        {
            is_Prime(m);
            if (true) {
                cout << n << endl;
            }
            n++;
        }
        return 0;
    }
    bool is_Prime(int m) {
        for (int n = 1; n < m; n++) {
            bool prime = true;
            for (int x = 2; x*x <= m; x++) {
                if (m % x == 0) {
                 prime = false;
                }
            }
            if (prime = true)
            {
                return true;
            }
        }
    }

    Second: 

    bool is_Prime(int m);
    #include <iostream>
    using namespace std;
    int main() {
        int m;
        cout << "Your input: ";
        cin >> m;
        cout << "The prime numbers less than or equal to " << m << " are:" << endl;
        is_Prime(m);
        return 0;
    }
bool is_Prime(int m) {
    for (int n = 1; n < m; n++) {
        bool prime = true;
        for (int x = 2; x*x <= n; x++) {
            if (n % x == 0) {
                prime = false;
            }
        }
        if (prime)
            cout << n << " " << endl;
    }
    return 0;
}

所以,问题是下面的函数自己打印数字。

bool is_Prime(int m) {
    for (int n = 1; n < m; n++) {
        bool prime = true;
        for (int x = 2; x*x <= n; x++) {
            if (n % x == 0) {
                prime = false;
            }
        }
        if (prime)
            cout << n << " " << endl;
    }
    return 0;
}

解决方案一:修改函数,使其只检查给定的一个素数,并在main中从1到最大值进行循环,为每个数字调用is_prime,如果函数返回true,则打印该数字。

bool is_Prime(int p) {
    for (int x = 2; x*x <= p; x++) {
        if (p % x == 0) {
            return false;
        }
    }
    return true;
}
...
//in main:
for(int p = 1; p < m; p++)
{
    if(is_prime(p))
        cout << p << endl;
}  

解决方案二(更好):
在函数中加入另一个变量,例如:a std::vector<int> v;,而不是打印找到的素数,而是将它们添加到具有v.push_back(n);的向量中。返回整个向量(在检查了所有数字之后)。在main中,只打印vector中包含的每个数字。这使您能够在函数中使用更好的算法(因为一次调用检查所有数字),如筛方法,以使一切更快。

在你的第二次尝试(标记为第一次)中有相当多的错误。

is_Prime(m);

这是不断检查一个数字,而不是所有小于m的数字,用n代替m。

if (true) {

这将始终被执行。要么存储is_Prime的返回值,要么直接在if语句中调用它。

if (prime = true)

这将设置prime为true,然后测试prime。你想==.

不能在is_Prime

的末尾返回false
for (int n = 1; n < m; n++) {

在is_Prime函数中不需要这样做,因为在外部函数中有while循环。