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

本文介绍了一种使用筛子法求解指定范围内所有素数的方法,并通过两两组合求得其和为偶数的所有可能。通过示例代码详细展示了如何实现这一过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

给你一个自然数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;
    }




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值