让我们来寻找1到1000之间所有可以表示为两个质数之和的数字,例如8=3+5,24=13+11。
现在可以通过迭代1到1000之间的质数列表以O(n^2)的时间复杂度完成此操作。
是否有一种方法可以以小于O(n^2)的时间复杂度完成相同的操作?是否有一种线性时间的方法来做到这一点?
让我们来寻找1到1000之间所有可以表示为两个质数之和的数字,例如8=3+5,24=13+11。
现在可以通过迭代1到1000之间的质数列表以O(n^2)的时间复杂度完成此操作。
是否有一种方法可以以小于O(n^2)的时间复杂度完成相同的操作?是否有一种线性时间的方法来做到这一点?
对于我们现在所知道的所有偶数,它们都可以表示为两个质数的和(详见哥德巴赫猜想)。
对于所有奇数,如果它可以表示为两个质数的和,则其中一个必须是2,另一个应该是一个奇素数。
因此,总数应该是(1000/2-1)+(从3到997的素数计数),
其中,
(1000/2-1)是4、6、8、10……等数列的总数,
(从3到997的素数计数)是5(2+3)、7(2+5)、9(2+7)、13(2+11)等数列的总数。
p
。如果数字i
是质数,则将p[i]
设置为true
,否则设置为false
。O(N^2)
:在外层循环中遍历1到1000之间的数字k
,然后在内层循环中遍历所有大于k
的质数x
,并检查是否存在一个质数使得p[k-x]
为true
。for k in 1..1000
for x in primes greater than k
if (p[x-k])
print k can be represented as x plus (x-k)
break
我怀疑检查1000个数字的总运行时间为O(N)
时,检查是否可以在恒定时间内完成,因为目前计算机辅助验证的速度相对较慢。
import java.util.Scanner;
public class SumOfNPrmNos_2 {
public static void main(String[] args) {
int swap,sum=0;
Scanner sc=new Scanner(System.in);
System.out.println("Enter Number Range From ");
int small=sc.nextInt();
System.out.println("Enter Number Range To ");
int big=sc.nextInt();
for (int i =small+1 ; i<big; i++) {
char check='T';
for (int j=2 ; j<=Math.sqrt(i) ; j++){
if(i%j==0){
check='F';
break;
}
}
if(check=='T'){
sum=sum+i;
}
}
System.out.println("Sum Is : = "+sum);
}
}
1!1对于这个问题是一个好的公式。首先,进行1000 + 1除以5x + 38的计算。这是根据ATF定理得出的。尝试一下,你会得到答案。
#include<stdio.h>
int prime(int);
int main()
{
int num, r1, r2, i, j, c=0;
printf("enter number\n");
scanf("%d", &num);
for(i=num-1, j=1; i>=j; i--, j++) //this divides numb
{
r1=prime(i);
r2=prime(j);
if(r1==1 && r2==1)
{
printf("Numbers are %d and %d\n", i, j);
c++;
}
}
if(c==0)
printf("cannot be expressed as sum of primes\n");
}
int prime(int n)
{
int i;
for(i=2; i<=n; i++)
if(n%i==0)
break;
if(n==i)
return 1;
else
return 0;
}