在c++中使用while循环查找下一个素数的简单函数

huus2vyu  于 2023-06-07  发布在  其他
关注(0)|答案(4)|浏览(188)

第一篇文章Hello World LOL
我开始学习C++,做一些挑战。我发现的一个是“找到下一个素数”给定一个整数,做一个函数来找到下一个连续的素数,例如如果给定12返回13,如果给定24返回29,如果给定一个素数返回那个。我不明白为什么下面的代码块不起作用(我的猜测是其中的两个条件

int nextPrime(int num) {

while (num % 2 !=0 && num %3 != 0 && num %4 != 0 && num %5 != 0 && num %6 != 0 && num %7 != 0 && num %8 != 0 && num %9);
         ++num;

return num;

}
这是一个相对容易的任务,但事实上,我不知道为什么它不工作困扰我更多的事实,它不工作。任何帮助你可爱的互联网人可以提供是最受欢迎的。

6mzjoqzu

6mzjoqzu1#

public int findDuplicate(int i=2; i<=n;i++){ if(n%i==0){ return false }
返回true

px9o7tmv

px9o7tmv2#

你要做的是从下一个数字开始检查每个数字到给定的数字,看看它是否是素数。然后返回第一个素数
1.在nextPrime()函数中,我们从下一个数字开始取一个数字到给定的数字。
1.然后在isPrime()中,检查它是否是素数。
1.如果是,则返回号码。否则继续下一个。

bool isPrime(int n) 
{ 
    // Corner case 
    if (n <= 1) 
        return false; 
  
    // Check from 2 to n-1 
    for (int i = 2; i < n; i++) 
        if (n % i == 0) 
            return false; 
  
    return true; 
}

int nextPrime (int n){
    for (int i=n+1; i<1000000; i++){
        if (isPrime(i)) return i;
    }
}
xfb7svmp

xfb7svmp3#

#include <bits/stdc++.h>
using namespace std;

//check if number is prime divide by all number less than sqrt(n)
bool isprime(int n){
    for(int i=2;i*i<=n;i++){
        if(n%i==0){
            //not a prime return false then.
            return false;
        }
    }// its a prime number.
    return true;
}

int main() {
    
    int n = 12345;
    
    while(1){
        if(isprime(n)){
            cout << n <<endl;
            // id its a prime number we are done break the loop.
            break;
        }
        // increase n by 1. continue the loop untill the next prime.
        n+=1;
    }
    return 0;
}
e3bfsja2

e3bfsja24#

它不起作用的原因是因为你想在num不是素数的时候增加它。当它不是质数时,它可以被某个数整除。如果某个值可以被N整除,那么num % N == 0,但是你测试的是非零值。
相反,你想做:

// Increment num as long as it is divisible by any of these numbers.
while (num % 2 == 0 || num % 3 == 0 || num % 4 == 0 || num % 5 == 0 || num % 6 == 0 || num % 7 == 0 || num % 8 == 0 || num % 9 == 0)
  ++num;

此外,您确实在while后面放了一个分号,导致它无限循环,而没有每次更改num。或者,如果num可以被任何给定的数字整除,只需将num递增一次。
还要注意,不需要检查num是否能被合数整除;如果是,那么你已经发现它可以被它的一个因子整除。例如,检查它是否能被4整除是没有意义的,因为你已经发现在这种情况下它能被2整除。
因此,另一项改进是:

// Increment num while NOT "not divisible by 2 and not divisible by 3, etc".
while (!(num % 2 != 0 && num % 3 != 0 && num % 5 != 0 && num % 7 != 0) && num % 11 != 0)
  ++num;

最后,你必须意识到这是一种相当糟糕的编码方式,因为你只是以这种方式硬编码应用程序中的所有素数,在这种情况下,你还不如把它们都放在一个表中,然后找到第一个大于或等于起始值的素数。

相关问题