您的位置:首页 > 其它

[6,n]中的素数之和为偶数的打印出来

2014-09-18 20:19 155 查看
题目就这么简单。

本题首先是求素数可以进行优化,采用之前的素数筛选法先把[6,N]中的素数找出来,但是有一个问题,必须从头开始筛选

【6,n】中的素数都是奇数,其实所有的素数中,只有2是偶数,[6,n]中的所有素数的和就是偶数,采用遍历的方法就可以把偶数找出来,算法复杂度为o(n2)

解法1:

#include<iostream>
#include<string.h>
using namespace std;

int main()
{
int n;
int count = 0;
int i;
int j;
int sum;
cout<<"enter N(N>=6) = ";
cin>>n;
//build array
int *array = new int[n+1];
int *save = new int[n+1];
//initialize the array
//memset only used for char
/*memset(array,0x1,sizeof(array));*/
//Screening of prime Numbers
for(i = 2;i <= n;i++)
array[i] = 1;

for(i = 2;i <= n;i++)
{
if(array[i] == 1)
{
//j is used for counting
for(j = i;j <= n/i;j++)
{
array[i*j] = 0;
}
}
}

cout<<"the prime numer is follows:"<<endl;
for(i = 6;i <= n;i++)
{
if(array[i] == 1)
{
printf("%-4d  ",i);
save[count] = i;
count++;
}
}
cout<<"\n"<<endl;

//print even numbers:

cout<<count<<" even numbers are follows:"<<endl;

delete array;
array = new int[n+n+1];
for(i = 2;i <= n+n;i++)
array[i] = 0;
//可能会有重复的数,要进行筛选
//对重复的数字可以用哈希,但是如果数字太大反而需要太多额外空间的开销 得不偿失
for(i = 0;i <count-1;i++)
{
for(j = i+1;j < count;j++)
{
sum = save[i]+save[j];
array[sum] = 1;
}
}
for(i = 6+6;i <= n+n;i++)
{
if(array[i] == 1)
cout<<i<<" ";
}
cout<<endl;
}


解法2:

记得数学上有这样一个猜想:哥德巴赫猜想

任一大于2的偶数,都可表示成两个素数之和

所以可以从偶数入手,先找出偶数的两个素数,判断素数有没有在给定的范围内

(待实现)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: