在hackerearth中获得TLE

时间:2018-11-08 09:18:56

标签: c++ c algorithm primes

当我在hackerearth提交此代码时,我获得了TLE。

任何建议我该如何优化 码。

#include <stdio.h>
#include <stdlib.h>

int checkPrime(int);

int main() {
int a, b,
    reminder,sum=0,n;

    scanf("%d %d",&a,&b);

    while(a <= b) {
        n = a;
        sum = 0;
        reminder = 0;

        while (n > 0) {
        reminder = n % 10;
        sum += reminder;
        n = n / 10;
        }

        if(sum > 1 && checkPrime(sum) == 1 && checkPrime(a) == 1) {
            printf("%d ",a);  
        }

        ++a;
    }

return 0;
}

int checkPrime(int p) {

int i,flag=1;

for(i=2; i <= p / 2; i++){
    if(p%i == 0)  {
        flag = 0;
        break;  
    }
}

return flag;

}

Here is the problem i coded for

我该如何分析此代码并获得 时间复杂度。

2 个答案:

答案 0 :(得分:1)

您的checkprime函数需要大量的运行时间。它运行N/2个操作。

您正在为所有数字运行此代码,因此您正在执行N*N/2个操作,这太多了。

我建议您使用更好的生成素数的方法。看看the Sieve of Eratosthenes

答案 1 :(得分:1)

例如,有一些原始方法,例如遍历奇数和更多优化

int isPrime ( int n )
{
    if (n <= 1) return 0; // zero and one are not prime
    unsigned int i;
    for (i=2; i*i<=n; i++) {
        if (n % i == 0) return 0;
    }
    return 1;
}
在您的情况下,

Seive kill (如果您不考虑内存需求),因为范围可能非常大{{1} },您可能想使用某种位图来生成Seive。

这是一篇关于如何生成和使用Seive的非常松散的想法。

1000000