需要使代码高效并降低时间复杂度

Need to make code efficient and reduce time complexity

给定范围 [ L , R ](包括两者),我必须找出给定范围内两个素数之间的最大差值。对于给定的范围,可能有三个答案。

如果在给定范围内只有一个不同的素数,那么这种情况下的最大差值为 0。

如果给定范围内没有素数,则这种情况的输出将为 -1。

示例:

Range: [ 1, 10 ]

The maximum difference between the prime numbers in the given range is 5.

Difference = 7 - 2 = 5


Range: [ 5, 5 ]

There is only one distinct prime number so the maximum difference would be 0.


Range: [ 8 , 10 ]

There is no prime number in the given range so the output for the given range would be -1.

输入格式 输入的第一行包含测试用例的数量,T

接下来的 T 行,每行由两个 space 分隔的整数组成,L 和 R

约束条件 1<= T <=10

2<=长<=右<=10^6

这是我的代码:

    #include <stdio.h>
    int isprime(int n)
    {
        int i,c=0;
        for(i=1;i<n;i++)
        {
            if(n%i==0)
             c++;
        }
        if(c==1)
         return 1;
        else
         return 0;
    }
    
    int main()
    {
        int t; //testnumber
        scanf("%d",&t);
        for(int k=0;k<t;k++)
        {
         int l,r; //l=low or floor, r = highest range or ceiling;[l,r]
         scanf("%d%d",&l,&r);
         int n = r-l; //difference in range
         int a[n]; 
         int j=0;
         for(int i=l;i<=r;i++)
         {
             if(isprime(i)==1)
             {
                a[j] = i;
                j++;
             }
         }
         int d = a[j-1]-a[0];
         if(j==0)
          printf("%d\n",-1);
         else
          printf("%d\n",d);
        } 
        return 0;
    }

此任务不需要任何特殊算法(除了在 O(sqrt(N)) 中检查数字是否为素数)即可高效解决。想一想质数,它们在某个范围内(例如从 1 到 100 的范围内)出现的频率是多少?出现的某种“模式”是什么。现在,如果我正确地理解了这个任务,你需要找到 last_prime_on_range - first_prime_on_range 范围内素数的最大差异,根据这次和之前的观察,你可以轻松设计出一种有效的算法。

剧透:

你不需要检查整个范围,检查从 L 到 L+100 就足够了 从 R 到 R-100,显然如果 L+100>R 你可以从 L 到 R。 如果您想确定可以从 L 到 L+1000 以及从 R 到 R-1000,因为它不会对时间复杂度产生太大影响。 另外,在找到质数时添加 break; 也可以解决问题。 请注意,素数之间的差距不能保证低于 100/1000,但对于给定的范围,检查高达 1000 就足够了。

现在如果你需要检查范围内的所有质数,你应该了解 Sieve Of Eratosthenes

在 forum/stack 上发帖或要求审核时,请尝试适当地命名您的变量。否则,很难遵循代码或哪个变量的用途。

我写了下面的代码希望你能理解我的实现。

#include <iostream>
#include <math.h>
using namespace std;

void isPrime(int num, int* primeNumber)
{
    if (num == 2)
    {
        *primeNumber = num; //2 is a prime number
        return;
    }
    if (num%2 == 0)
    {
        return; //num is an even number, so, not prime
    }
    int limit = sqrt(num);
    if (limit*limit == num)
    {
        return; //num is a square number, so, not prime
    }
    for (int i = 3; i <= limit; i=i+2)//to find if a number is prime or not, we only have to divide it from 2 to sqrt(num).
    {          //i=i+2 skips even number, cause already checked if num is even or not.
        if (num % i == 0)
        {
            return; //`num` is divisible by i, so, not prime
        }
    }
    *primeNumber = num; //no divisible number found. so, num is prime.
}

int main() 
{
    int testNumber;
    cout<< "Enter testNumber: ";
    cin>> testNumber;

    for (int i = 0; i < testNumber; ++i)
    {
        int  newLow, low, high, lowestPrime = 0, highestPrime = -1;
        cin>> low>> high;
        newLow = low;
        if (low == high)
        {
            cout<<"0\n";
            continue;
        }

        for (int j = low; j <= high; ++j)//find the lowest prime
        {
            isPrime(j, &lowestPrime);
            if (lowestPrime != 0)//if lowest prime found, lowestprime will no longer be 0
            {
                //cout<<"lowest prime: "<<lowestPrime<<endl;
                newLow = j; //there is no prime number between low...newLow
                break;
            }
        }

        for (int j = high; j >= newLow; j--)//find highest prime
        {
            isPrime(j, &highestPrime);
            if (highestPrime != -1)//if highest prime found, highestprime will no longer be -1
            {
                //cout<<"highest prime: "<<highestPrime<<endl;
                break;
            }
        }

        cout<<highestPrime - lowestPrime<<"\n";
    }

    return 0;
}