📜  查找范围 [1, N] 中的素数,该素数也属于 Tribonacci 级数

📅  最后修改于: 2022-05-13 01:56:07.340000             🧑  作者: Mango

查找范围 [1, N] 中的素数,该素数也属于 Tribonacci 级数

给定一个数字N,任务是在[1, N]范围内找到素数,这也是从{0, 0, 1}开始的 Tribonacci 级数的一部分。

注意: Tribonacci 数列是下一项是前三项之和的数列。

例子:

朴素的方法:最简单的方法是生成范围 [1, N] 内的 Tribonacci 数列表,并在系列中找到 [1, N] 范围内的素数。

时间复杂度: O(N * √N)
辅助空间:O(N)

Efficient Approach:这个问题可以基于以下思路高效解决:

按照以下步骤实现上述想法:

  • 使用埃拉托色尼筛法生成素数列表。
  • i = 3 迭代到 n (其中第 n 个 Tribonacci 数至少为 N):
    • 通过公式t(n) = t(n-1)+t(n-2)+t(n-3)计算第i 个Tribonacci 数
    • 借助已计算的素数检查t(n)是否为素数。
    • 将它们存储在一个数组中(比如answer[] )。
  • 最后打印answer[]的所有元素。

下面是上述方法的实现。

C++
// C++ code to implement the approach
  
#include 
using namespace std;
  
// Function to find the primes upto N using
// Sieve of Eratosthenes technique
void sieve(vector& primes, int N)
{
    for (int i = 2; i * i <= N; i++) {
        if (primes[i] == true) {
            for (int j = i + i; j <= N; j = j + i) {
                primes[j] = false;
            }
        }
    }
}
  
// Function to find the count of the numbers
vector findValues(int N)
{
    // Stores all the prime number till n
    vector primes(N + 1, true);
  
    // 0 and 1 is not prime number
    primes[0] = false;
    primes[1] = false;
  
    sieve(primes, N);
  
    vector tribonacci(N + 1);
    tribonacci[0] = 0;
    tribonacci[1] = 0;
    tribonacci[2] = 1;
  
    // Generating the sequence using formula
    // t(i) = t(i-1) + t(i-2) + t(i-3).
  
    for (int i = 3; tribonacci[i - 1] <= N; i++) {
        tribonacci[i] = tribonacci[i - 1]
                        + tribonacci[i - 2]
                        + tribonacci[i - 3];
    }
  
    // Store the answer
    vector ans;
  
    // Iterating over all the Tribonacci series
    for (int i = 0; tribonacci[i] <= N; i++) {
        int p = tribonacci[i];
  
        // Check if the ith tribonacci
        // is prime or not
        if (primes[p] == true) {
            ans.push_back(p);
        }
    }
    return ans;
}
  
// Driver code.
int main()
{
    int N = 10;
  
    // Function call
    vector ans = findValues(N);
  
    // Printing Tribonacci numbers which are prime.
    for (int i = 0; i < ans.size(); i++) {
        cout << ans[i] << " ";
    }
    if (ans.size() == 0)
        cout << -1;
    return 0;
}


输出
2 7 

时间复杂度: O(N*log(log(N)))
辅助空间: O(N)