哥德巴赫猜想-有关素数问题

哥德巴赫猜想大家都知道一点吧.我们现在不是想证明这个结论,而是想在程序语言内部能够表示的数集中,任意取出一个偶数,来寻找两个素数,使得其和等于该偶数. 
做好了这件实事,就能说明这个猜想是成立的. 
由于可以有不同的素数对来表示同一个偶数,所以专门要求所寻找的素数对是两个值最相近的. 

Input

输入中是一些偶整数M(5<M<=10000). 

Output

对于每个偶数,输出两个彼此最接近的素数,其和等于该偶数. 

Sample Input

20 30 40

Sample Output

7 13
13 17
17 23

代码 

#include<stdio.h>
int f(int n)                
{
    int i;
    for(i=2; i<n/2; i++)
    {
        if(n%i==0)
            break;
    }
    if(i==n/2)
        return 1;      //调用函数,判断一个数 n 是否为素数,是的话标记为 1 
}

int main ()
{
    int M;
    while(scanf("%d",&M)!=EOF)
    {
        int a=M/2;     //寻找的是两个最接近的素数,对半分开,从中间开始寻找
        for(int i=0; i<=a; i++)          
        {
            if(f(a-i)==1&&f(a+i)==1)     //从两边开始函数判断
            {
                printf("%d %d\n",a-i,a+i);
                break;
            }
        }
    }
    return 0;
}

方法二:筛选法求素数,31ms,上面的方法,41ms

#include<cstring>
#include<algorithm>
using namespace std;
const int N=10000;
int a[110000];


//筛选法求素数,先打表,将10000以内素数求出来 
void is_sushu()
{
	memset(a,0,sizeof(a));
	a[1]=1;
	for(int i=2;i<=sqrt(N);i++)
	{
		if(a[i]==0)
		{
			for(int j=2;j*i<=N;j++)
			{
				a[i*j]=1;
			}
		}
	}
}

int main()
{
	is_sushu();
	int n;
	while(~scanf("%d",&n))
	{
		int i=n/2;//寻找的是两个最接近的素数,对半分开,从中间开始寻找
		while(i!=n)//当然如果正中间是素数,是最理想答案 
		{
			if(a[i]==0)//判断是否符合 
			{
				if(a[n-i]==0)//再判断n-i是否符合 
				{
					printf("%d %d\n",n-i,i);//符合输出  结束循环
					break;
				}
			}
			i++;//不符合,i+1 
		}
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_42785885/article/details/81394852