当我在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
我该如何分析此代码并获得 时间复杂度。
答案 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