在打印给定范围的最后一个素数后从函数中跳出循环

Posted

技术标签:

【中文标题】在打印给定范围的最后一个素数后从函数中跳出循环【英文标题】:Breaking out of loop from function after printing the last prime number of a given range 【发布时间】:2021-08-28 04:43:21 【问题描述】:

我正在编写一个代码来查找给定范围的最后一个素数。假设范围是 1 到 50。那么最后一个素数。我想打印必须是 47。我的想法是可能反转范围内素数的顺序,然后尝试只打印第一个值。再次有点像如果我的订单是 1 到 50,那么我将从 47、43 等开始打印,并且只打印 47。但我被卡住了,不知道如何做到这一点。这是我的代码

int prime_bef(int n)

int check = 0;
for (int i = 1; i <= n; i++)

    if (n % i == 0)
    
        check++;
    

if (check == 2)

    cout << n << " ";


return 0;


int main ()

   int l; 
   int u;
   cin >> l >> u;

   for (int i = u; i >= l; i--)
   
      prime_bef(i);
   

   return 0;

【问题讨论】:

“但我被卡住了”——卡住了什么?看起来你有做某事的代码。你具体坚持哪一个?代码不能编译吗?它会吐出大英百科全书而不是质数吗?介于两者之间? 【参考方案1】:

您可以在要结束程序的地方使用exit(),它适用于您的情况。但到目前为止,最好的方法是返回一个值来测试是否继续,它是最易读的。

#include<iostream>
#include <stdlib.h>
using namespace std;
int prime_bef(int n)

int check = 0;
for (int i = 1; i <= n; i++)

    if (n % i == 0)
    
        check++;
    

if (check == 2)

    cout << n << " ";
    exit(0);


return 0;


int main ()

   int l; 
   int u;
   cin >> l >> u;

   for (int i = u; i >= l; i--)
   
      prime_bef(i);
   

   return 0;

使用 bool 返回类型的相同代码:

#include<iostream>
using namespace std;
bool prime_bef(int n)

int check = 0;
for (int i = 1; i <= n; i++)

    if (n % i == 0)
    
        check++;
    

if (check == 2)

    cout << n << " ";
    return true;


return false;


int main ()

   int l; 
   int u;
   cin >> l >> u;

   for (int i = u; i >= l; i--)
   
      if(prime_bef(i))
        break;
   

   return 0;

【讨论】:

见Why should I not #include <bits/stdc++.h>? 和Why using namespace std is bad practice。我认为在答案中看到这些恐怖比在问题中看到这些恐怖更糟糕,因为答案的目标是成为示例。【参考方案2】:

这是检查数字是否为素数的一种简单有效的方法。我正在检查数字是否为素数,当它为真时,我正在打印数字并打破循环,以便只打印 1 个数字。您始终可以删除 break 语句并打印范围内的所有素数。

#include<iostream>

using namespace std;

bool isPrime(int n)
    if(n==2)return true;
    if(n%2==0 || n==1)return false;
    for(int i=3; i*i<=n; ++i)
        if(n%i==0)
            return false;
        
    
    return true;


int main ()
    int l, u;
    cin>>l>>u;  
    for (int i = u; i >= l; i--)
        if(isPrime(i))
            cout<<i<<"\n";
            break;
        
    
    return 0;   

【讨论】:

完美运行。我没有得到的一件事是 bool 函数中的 for 循环行。写 (i*i 是的,它是i*i&lt;=n。这是数学。试着用笔和纸模拟这个过程。【参考方案3】:

我会给你一个提示......当你在迭代检查数字的质数时,还要检查循环中计算的最后一个质数是否大于范围的最大项并打破循环当条件变为假时。

【讨论】:

表示上限的范围的最大项?【参考方案4】:

这里是 C++17 方法:

#include <cmath>
#include <iostream>
#include <vector>

// type to use for storing primes 
using prime_t = unsigned long;

// there is a way to determine an upper bound to the number of primes smaller then a maximum number. 
// See : https://primes.utm.edu/howmany.html
// this can be used to estimate the size of the output buffer (vector)
prime_t pi_n(const prime_t max)

    prime_t pi_n max ;

    if (max > 10)
    
        auto ln_n = std::log(static_cast<double>(max));
        auto value = static_cast<double>(max) / (ln_n - 1.0);
        pi_n = static_cast<prime_t>(value + 0.5);
    

    return pi_n;


// Calculate prime numbers smaller then max
// https://en.wikipedia.org/wiki/Sieve_of_Eratosthenes
auto calculate_primes(const prime_t max)

    std::vector<bool> is_primes(max, true);

    // 0, 1 are not primes
    is_primes[0] = false;
    is_primes[1] = false;

    // sieve
    for (prime_t n = prime_t 2 ; n < prime_t max ; ++n)
    
        if (is_primes[n])
        
            auto n2 = n * n;
            for (prime_t m = n2; m < max; m += n)
            
                is_primes[m] = false;
            
        
    

    // avoid unnecessary resizes of vector by pre-allocating enough entries to hold result
    prime_t n 0 ;
    std::vector<prime_t> primes;
    primes.reserve(pi_n(max));

    // add all prime numbers found by the sieve
    for (const auto is_prime : is_primes)
    
        if (is_prime) primes.push_back(n);
        n++;
    

    return primes;


int main()

    const prime_t max 50 ;
    auto primes = calculate_primes(max);
    // max prime is last one in container
    auto max_prime = primes.back();
    std::cout << "maximum prime number smaller then " << max << ", is " << max_prime << std::endl;

【讨论】:

prime_t n = max-1; while ( !is_prime[n] ) --n; ; return n; 也可以吗?

以上是关于在打印给定范围的最后一个素数后从函数中跳出循环的主要内容,如果未能解决你的问题,请参考以下文章

为啥函数不会跳出这个循环?

java中跳出循环的方式

python如何跳出无限循环并执行下一个函数

如何退出运行循环?

关于[JS] forEach循环return无法跳出的踩坑和解决方案

python怎么跳出循环