寻找素数对
TimeLimit:1000ms MemoryLimit:128000KB
64-bit integer IO format:%lld
Problem Description
哥德巴赫猜想大家都知道一点吧.我们现在不是想证明这个结论,而是想在程序语言内部能够表示的数集中,任意取出一个偶数,来寻找两个素数,使得其和等于该偶数.
做好了这件实事,就能说明这个猜想是成立的.
由于可以有不同的素数对来表示同一个偶数,所以专门要求所寻找的素数对是两个值最相近的.
Input
输入中是一些偶整数M(5<M<=10000).
Output
对于每个偶数,输出两个彼此最接近的素数,其和等于该偶数.
SampleInput
20 30 40
SampleOutput
7 13 13 17 17 23
1 #include <stdio.h> 2 int main() 3 { 4 int m,i,j; 5 while ( scanf("%d",&m)!=EOF ) 6 { 7 int num[m]; 8 for (i=0;i<m;++i)///初始化数组表 9 num[i]=1; 10 for (i=2;i<m;++i)//建立素数表 11 for (j=2;;++j) 12 { 13 if (i*j>m) 14 break; 15 num[i*j]=0; 16 } 17 for (i=m/2;;--i)//遍历求素数对 18 { 19 20 if (num[i]==1 && num[m-i]==1)//素数对所要满足的条件 21 break; 22 } 23 printf("%d %d\n",i,m-i); 24 } 25 return 0; 26 }
Ac Code
AC思路:
1.以输入的数值m为界限,列举出素数表。(因为里m最近的素数对一定的m/2的附近)
2.以i=m/2为起始点,向前遍历,当遇到是素数是,再检查m-i是否为素数。这样可以检查出距离彼此最近的素数之和等于m的素数对。
另一种思路:
在Ac后查看他人的代码,发现另外一种思路。
1.仍然从m/2向前或向后遍历。
2.写个函数isprimer();检查某一数值i是否为素数,该数是,则检查对应m-i是否素数,如果是则最近的素数对就是这两个数。
思考:看完后发现其实并不需要建立素数表,因为该题因为可以只需要进行两个数的判断素数与否。这样就减轻计算工作量。
时间: 2024-10-13 21:37:46