查找范围 [1, N] 中的素数,该素数也属于 Tribonacci 级数
给定一个数字N,任务是在[1, N]范围内找到素数,这也是从{0, 0, 1}开始的 Tribonacci 级数的一部分。
注意: Tribonacci 数列是下一项是前三项之和的数列。
例子:
Input: N = 10
Output: 2 7
Explanation: The first few terms are 0, 0, 1, 1, 2, 4, 7, 13.
Primes in the range [1, 10] are 2 and 7.
Input: N = 2
Output: 2
朴素的方法:最简单的方法是生成范围 [1, N] 内的 Tribonacci 数列表,并在系列中找到 [1, N] 范围内的素数。
时间复杂度: O(N * √N)
辅助空间:O(N)
Efficient Approach:这个问题可以基于以下思路高效解决:
Generate a list of primes using Sieve of Eratosthenes and then generate Tribonacci number by formula t(n) = t(n-1)+t(n-2)+t(n-3) and find all the prime numbers of the series.
按照以下步骤实现上述想法:
- 使用埃拉托色尼筛法生成素数列表。
- 从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)