寻找素数对
寻找素数对
Time Limit : 2000/1000ms (Java/Other) Memory Limit : 65536/32768K (Java/Other)
Total Submission(s) : 14 Accepted Submission(s) : 12
Problem Description
哥德巴赫猜想大家都知道一点吧.我们现在不是想证明这个结论,而是想在程序语言内部能够表示的数集中,任意取出一个偶数,来寻找两个素数,使得其和等于该偶数. 做好了这件实事,就能说明这个猜想是成立的. 由于可以有不同的素数对来表示同一个偶数,所以专门要求所寻找的素数对是两个值最相近的.
Input
输入中是一些偶整数M(5
Output
对于每个偶数,输出两个彼此最接近的素数,其和等于该偶数.
Sample Input
20
30
40
Sample Output
7 13
13 17
17 23
Source
浙江工业大学第四届大学生程序设计竞赛
输入一个数,然后寻找两个最邻近的素数,而且,这两个素数相加的和等于这个数;所以这两个素数肯定在这个数一半的左右两边,
题目要求素数的范围不大,直接用素数筛选法找出1~10000内所以的素数。在输入的时候,只需要对输入的数的一般,开始左或右查找即可。
如果,该数的一般刚好数素数,可以直接输出两个该数字一半即可。

1 #include <stdio.h> 2 #define Max(a,b) a>b? a:b 3 #define Min(a,b) a>b? b:a 4 #include <string.h> 5 int main() 6 { 7 int i,j,a[11000]={0},NUM;/*素数筛选法*/ 8 for(i=2;i<=10050;i++) 9 a[i]=1; 10 for(i=2;i<=10050;i++) 11 if(a[i]) 12 for(j=i+i;j<=10050;j+=i) 13 a[j]=0; 14 while(scanf("%d",&NUM)!=EOF) 15 { 16 if(a[NUM/2]) /*看输入的数一般是否是素数,是的话,直接输出*/ 17 { 18 printf("%d %d\n",NUM/2,NUM/2); 19 continue; 20 } 21 for(i=NUM/2,j=1;i<NUM,j<NUM/2;j++) /*从右边开始查找,因为左右两边会是对称的,*/ 22 if(a[i+j]&&a[i-j]) /*直接判断左右对称的是否都为素质,即为所请的值*/ 23 { 24 printf("%d %d\n",i-j,i+j); 25 break; 26 } 27 } 28 return 0; 29 }
修改:2015.6.1

1 #include <iostream> 2 #include <stdio.h> 3 #include <string.h> 4 using namespace std; 5 int Pr[10010]={0}; 6 void Cread() 7 { 8 int i,j; 9 for(i=1;i<=10000;i++)Pr[i]=1; 10 for(i=2;i<=10000;i++) 11 { 12 if(Pr[i]) 13 for(j=2;i*j<=10000;j++)Pr[i*j]=0; 14 } 15 return ; 16 } 17 int main() 18 { 19 int N,C,X,i; 20 Cread(); 21 while(scanf("%d",&N)!=EOF) 22 { 23 X=N/2; 24 for(i=0;X-i>=1;i++) 25 { 26 if(Pr[X-i]&&Pr[X+i]) 27 { 28 printf("%d %d\n",X-i,X+i); 29 break; 30 } 31 } 32 } 33 return 0; 34 }
转载请备注:
**************************************
* 作者: Wurq
* 博客: https://www.cnblogs.com/Wurq/
* Gitee: https://gitee.com/wurq
**************************************
**************************************
* 作者: Wurq
* 博客: https://www.cnblogs.com/Wurq/
* Gitee: https://gitee.com/wurq
**************************************