【问题标题】:How to print the b-th prime number coming after n?如何打印n之后的第b个素数?
【发布时间】:2021-04-17 21:34:31
【问题描述】:

我正在尝试编写一个 c++ 程序,它从用户那里获取一个整数 n (n>=1 && n

#include <iostream>
using namespace std;

bool isPrime(int n)
{
    if(n <= 1)
        return false;
    for(int i = 2; i <= (n/2); i++)
        if(n % i == 0)
            return false;
    return true;
}
int main()
{
    long int n;
    int b = 0;
    cin>>n;
    while(n >= 1 && n <= 100000){
        b += n % 10;
        n /= 10;
    }

    for(int i = n, counter = b; counter <= 10; i++)
        if(isPrime(i)){
            counter++;
            if(i > n)
                cout<<counter<<"th prime number after n is : "<<i<<endl;
        }
    return 0;
}

因此,根据@Bob__ 的回答(并将其转换为我在初始代码中使用的代码样式),我的问题的可能解决方案之一如下:

#include <iostream>
using namespace std;

bool isPrime(long int number)
{
    if(number <= 1)
        return false;
    for(int i = 2; i <= (number / 2); i++)
        if(number % i == 0)
            return false;
    return true;
}

int sumOfDigits(long int number)
{
    int sum = 0;
    while(number >= 1 && number <= 100000)
    {
        sum += number % 10;
        number /= 10;
    }
    return sum;
}

long int bthPrimeAfter(int counter, long int number)
{
    while(counter)
    {
        ++number;
        if(isPrime(number))
            --counter;
    }
    return number;
}

int main()
{
    long int number;
    cin>>number;
    int const counter = sumOfDigits(number);
    cout<<bthPrimeAfter(counter, number)<<"\n";
    return 0;
}

【问题讨论】:

  • 您已经销毁了n 中的值以在while 循环中生成b。当for 循环出现时,n 保持为零。
  • 非常感谢。我完全忘记了这个编程规则。
  • 您是否阅读了prime numbers 上的维基百科页面?您是否阅读了primality tests 上的维基百科页面?您查看过this C++ reference 网站吗?你读过numerical digits 吗?

标签: c++ function for-loop if-statement


【解决方案1】:

正如dratenik 在他们的comment 中所说:

您已销毁 n 中的值以在 while 循环中生成 b。当for 循环出现时,n 一直为零。

这是理解的关键点,有时我们需要复制一个变量。一种方法是按值将其传递给函数。函数参数将是一个本地副本,可以在不影响原始副本的情况下进行更改。

例如,main 函数可以编写如下:

#include <iostream>

bool is_prime(long int number);
//            ^^^^^^^^ So is `n` in the OP's `main`

int sum_of_digits(long int number);
//                ^^^^^^^^^^^^^^^ This is a local copy.

long int nth_prime_after(int counter, long int number);

int main()
{
    long int number;
    // The input validation (check if it's a number and if it's in the valid range,
    // deal with errors) is left to the reader as an exercise.
    std::cin >> number;

    int const counter = sum_of_digits(number);

    std::cout << nth_prime_after(counter, number) << '\n';

    return 0;
}

sum_of_digits 的定义很简单。

int sum_of_digits(long int number)
{
    int sum = 0;
    while ( number )        // Stops when number is zero. The condition n <= 100000
    {                       // belongs to input validation, like n >= 0.
        sum += number % 10;
        number /= 10;       // <- This changes only the local copy.
    }
    return sum;
}

关于最后一部分(在所选数字之后找到第 n 个素数),我不确定提问者想要做什么,但即使 n 具有正确的值,for(int i = n, counter = b; counter &lt;= 10; i++) 也只是错误的。对于初学者来说,count &lt;= 10 的条件没有任何理由,或者至少没有我能想到的理由。

我会这样写:

long int nth_prime_after(int counter, long int number)
{
    while ( counter )
    {
        ++number;
        if ( is_prime(number) )
        {
            --counter;  // The primes aren't printed here, not even the nth.
        }
    }
    return number;      // Just return it, the printing is another function's
}                       // responsabilty.

关于is_prime 函数和该算法的整体(缺乏)效率可以说更多,但恕我直言,这超出了这个答案的范围。

【讨论】:

  • 正如您所指出的,它正在打印所需的正确输出!我不能感谢你。你的回答对我帮助很大!我正在尝试对一些给定的练习做各种代码和练习,所以真的不知道作者创建这个算法的目的是什么。只是我想获得超出我实际编程知识的正确输出。
猜你喜欢
  • 2017-03-06
  • 2012-03-26
  • 2023-03-19
  • 2023-02-03
  • 2022-09-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多