简体   繁体   中英

C++: find first prime number larger than a given integer

Question: How to find, for a given integer n , the first prime number that is larger than n ?


My own work so far

I've managed to write a program that checks whether or not a given integer is a prime or not:

#include <iostream>
#include <cmath>

using namespace std;

bool is_prime (int n)
{
    int i;
    double square_root_n = sqrt(n) ;
    for (i = 2; i <= square_root_n ; i++)
    {
        if (n % i == 0){
            return false;
            break;
        }
    }
    return true;
}

int main(int argc, char** argv)
{
    int i;
    while (true)
    {
        cout << "Input the number and press ENTER: \n";
        cout << "To exit input 0 and press ENTER: \n";
        cin >> i;
        if (i == 0)
        {
            break;
        }
        if (is_prime(i))
        cout << i << " is prime" << endl;
        else
        cout << i << " isn't prime'" << endl;
    }
    return 0;
}

I'm struggling, however, on how to proceed on from this point.

You have a function is_prime(n) , and a number n , and you want to return the smallest number q such that is_prime(q)==true and n <= q :

int q = n;
while (!is_prime(q)) {
    q++;
}
// here you can be sure that
// 1. q is prime
// 2. q >= n       -- unless there was an overflow

If you want to be a bit more efficient, you can check explicitly for the even case, and the increment by 2 each time.

It's a concrete example of a general theme: if you have a test function and a method for generating elements, you can generate the elements that pass the test:

x = initial_value
while (something) {
    if (test(x)) {
        // found!
        // If you only want the first such x, you can break
        break;
    }
    x = generate(x)
}

(note that this is not a valid C++ code, it's pseudocode)

int i;
**int k_koren_od_n = (int)(sqrt(n) + 0.5)**
for (i = 2; i <= k_koren_od_n ; i++){

To get around casting issues, you might want to add this fix.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM