您的位置:首页 > 其它

给你一个自然数N,求[6,N]之内的所有素数中,两两之和为偶数的那些偶数。

2014-08-25 10:17 29 查看
给你一个自然数N,求[6,N]之内的所有素数中,两两之和为偶数的那些偶数。

题目解析:

可以先求出所有的质数,然后两两相加,求得结果。那么求解质数时,就要对每一个6...N之间的数k,然后判断i由2...k,判断是不是k/i == 0。

那么有没有更好的方法?筛子法。但需要额外的辅助空间。

先以一个例子来讲解筛子法:求2-100间的所有质数。

方案:把所用的依次摆开,再依次筛掉2,3,5,7。。。。。。到47的倍数。不能用乘除只能用加减以加快速度。

#include <stdio.h>
int main(void)
{
int a[101],i,j;    //n+1
for(i=2;i<=100;i++)    //全部赋值
a[i]=i;

for(i=2;i<=50;i++) //筛掉i的倍数
{
if(a[i]!=0)    //加上这一句是为了加快速度
for(j=i+i;j<=100;j+=i)
a[j]=0;
}

for(i=2;i<=100;i++)    //对不为0的元素进行输出
if(a[i]!=0)printf("%3d",a[i]);
printf("\n\n");
return 0;
}


那么对于这道题目,也可以利用这个方法来做:先求出所有的数组,然后让两两素数相加,在相应的偶数的索引下标记为1。

#include<iostream>
using namespace std;
//筛子法求质数 可以参考亲和数
//6~N的质数,打印两两质数为偶数的所有这些偶数
//因为质数除开2以外都是奇数,那么大于6的偶数都是奇数,那么把6~N之间的质数都求出来,打印两两的和就可以了。
int main(){

cout << "输入N,产生的质数不大于范围 (6~N): ";
int n;
cin >> n ;

int *array = new int[n+n+1];// 定义array是一个数组指针
//init
for (int i = 0; i <= n+n ; i++)
array[i]=i;

for(int i =2; i*i <= n; i++)
for(int j=i+i; j <= n ; j+=i)
array[j]=0;

int count=0; //统计质数的个数

for (int i = 6; i <= n ; i++){

if(array[i] == i){
cout << array[i]<< " ";
count++;
}
}
cout<<endl<<"一共有"<<count<<"个质数";
cout <<endl<<"打印所有两两和为偶数,打印所有偶数 "<<endl;
//打印 两两之和为偶数的所有偶数
for (int i = 6; i <= n ; i++){
for (int j = i+1; j <= n ; j++)
if(array[i] == i&&array[j] == j){
int sum= array[i] + array[j];
array[sum]=1;
}
}
for (int i = 6+6; i <=n + n ; i++){
if(array[i] == 1)
cout << i << " ";
}

system("pause");
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐