📜  Prime Fibonnaci | TCS Mockvita 2020

📅  最后修改于: 2021-04-23 06:15:37             🧑  作者: Mango

问题描述

给定两个数字N1N2

  1. 找出N1N2之间的质数,然后
  2. 根据在步骤1中找到的质数列表,使所有可能的数字唯一组合成为可能。
  3. 从这个新列表中,再次找到所有素数。
  4. 从第二个生成的列表中找到最小的A和最大的B编号,并对该列表进行计数。
  5. 将最小和最大数分别作为生成斐波那契数列的第一个和第二个数,直到计数(第二个列表中的素数)。
  6. 打印斐波那契数列的最后一个数字作为输出

约束条件

2 <= N1,N2 <= 100

N2 – N1> = 35

例子:

方法:想法是使用Eratosthenes筛子检查在O(1)时间内特定数字是否为质数。因此,对从N1N2的所有数字进行迭代,并将该范围内的所有质数存储在数组中,然后使用嵌套循环查找质数的所有唯一可能组合。最后,从所有组合中找到素数,然后是这些素数的最小值和最大值。使用最小和最大素数,我们可以生成斐波那契数列,以计算斐波那契数列的最后一项(所有组合中的素数数)。

下面是上述方法的实现:

C++
// C++ implementation to compute the 
// combination of every possible 
// prime numbers of the range
  
#include 
using namespace std;
  
long long maxN = 1e5;
  
// Seive of Eratosthenes
void seive(vector& primes)
{
    for (long long num = 2; 
         num * num < maxN; num++) {
        if (primes[num]) {
            for (long long i = num * num;
                       i < maxN; i += num)
                primes[i] = false;
        }
    }
}
  
// Function to find the Nth term of
// of the Fibonacci series
long long solve(long long N1, 
                long long N2)
{
    vector primes(maxN, true);
    // 1 in not prime
    primes[1] = false;
    // generate all prime in range 
    // using siieve of eratosthenes
    seive(primes);
  
    vector filteredPrimes;
    vector comb;
    set lst;
  
    // filter required primes and
    // put them into filteredPrimes
    // as strings
    for (long long i = N1; i <= N2; i++)
        if (primes[i])
            filteredPrimes.push_back(
                          to_string(i));
  
    // make all possible combinations
    for (long long i = 0; 
         i < (long long)(filteredPrimes.size()); 
                                        i++) {
        for (long long j = 0; 
             j < (long long)(filteredPrimes.size()); 
                                        j++) {
            if (i == j)
                continue;
  
            string tmp = filteredPrimes[i] + 
                         filteredPrimes[j];
            comb.push_back(stoi(tmp));
        }
    }
  
    // Filter only prime numbers
    // for generated combinations
    for (long long x : comb)
        if (primes[x])
            lst.insert(x);
  
    auto it = lst.end();
    it--;
    
    // take smallest and largest element
    long long a = *(lst.begin()), b = *it, c;
  
    // Now find last element
    // of fibonacci series
    for (long long i = 3; 
         i <= (long long)(lst.size()); 
                                 i++) {
        c = a + b;
        a = b;
        b = c;
    }
  
    return c;
}
  
// Driver Code
int main()
{
    long long N1 = 2, N2 = 40;
  
    cout << solve(N1, N2);
  
    return 0;
}


输出
13158006689