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

简介:

【题目】

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


---------百度校招

【分析】

1.对于给定的N,我们可以用筛法求素素数的方法在O(n)的时间复杂度内求出所有的素数。

2.除2之外,所有的素数相加都为偶数,所以求出6~N之间的素数,打印两两的和就可以,时间复杂度O(n^2)

【代码】

#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;

const int MAX = 1000001;
int Mark[MAX];
int Prime[MAX];
// 刷法求素数
void IsPrime(){
    int index = 0;
    // 初始化
    memset(Mark,0,sizeof(Mark[0])*MAX);
    for(int i = 2;i <= MAX;i++){
        //如果未标记则得到一个素数
        if(Mark[i] == 0){
            Prime[index++] = i;
        }//if
        //标记目前得到的素数的i倍为非素数
        for(int j = 0;j < index,Prime[j] * i <= MAX;j++){
            Mark[Prime[j]*i] = 1;
            // prime数组 中的素数是递增的,当 i 能整除 prime[j],
            // 那么 i*prime[j+1] 这个合数肯定被 prime[j] 乘以某个数筛掉
            if(i % Prime[j] == 0){
                break;
            }//if
        }//for
    }//for
}

void PrimeSum(int n){
    int sum;
    int* array = (int*)malloc(sizeof(int)*(2*n));
    // 初始化
    memset(array,0,sizeof(array[0])*(2*n+1));
    // 统计
    for(int i = 6;i <= n;i++){
        // 非素数
        if(Mark[i] == 1){
            continue;
        }
        for(int j = i+1;j <= n;j++){
            // 非素数
            if(Mark[j] == 1){
                continue;
            }
            sum = i+j;
            // 两两之和为偶数的那些偶数
            if(array[sum] == 0){
                array[sum] = 1;
            }//if
        }//for
    }//for
    // 输出两两之和为偶数的那些偶数
    for(int i = 18;i <= (n+n);i++){
        if(array[i]){
            cout<<i<<endl;
        }//if
    }//for
}

int main(){
    //筛法求素数
    IsPrime();
    // 两两之和为偶数的那些偶数
    PrimeSum(11);
    return 0;
}


目录
相关文章
|
3月前
|
Java C++
数的范围(考查二分)
数的范围(考查二分)
35 0
|
4月前
|
Java
【剑指offer】-旋转数组的最小数字-06/67
【剑指offer】-旋转数组的最小数字-06/67
|
6月前
|
算法 测试技术 C++
C++二分算法习题:判断是否是完全平方数[容易]和排列箱子[容易]
C++二分算法习题:判断是否是完全平方数[容易]和排列箱子[容易]
|
2月前
|
机器学习/深度学习
一个偶数总能表示为两个素数之和。
一个偶数总能表示为两个素数之和
15 0
|
3月前
|
C++ Java Go
C/C++每日一练(20230409) 岛屿数量、出现次数最多整数、两数相除
C/C++每日一练(20230409) 岛屿数量、出现次数最多整数、两数相除
28 0
C/C++每日一练(20230409) 岛屿数量、出现次数最多整数、两数相除
|
3月前
|
机器学习/深度学习 存储 算法
数据结构与算法面试题:给定非负整数 m 和 n,计算不大于 m 的数字中,素数的个数。(提示:算法原理为埃氏筛、线性筛)
数据结构与算法面试题:给定非负整数 m 和 n,计算不大于 m 的数字中,素数的个数。(提示:算法原理为埃氏筛、线性筛)
34 0
|
4月前
|
算法 测试技术 C#
C++二分算法的应用:乘法表中第k小的数
C++二分算法的应用:乘法表中第k小的数
|
6月前
|
算法
OJ题库:奇偶数排序(使奇数全部都位于偶数前面)
OJ题库:奇偶数排序(使奇数全部都位于偶数前面)
33 0
|
8月前
判断10-105之间有多少个素数,并输出所有素数。【素数又称为质数,定义为在大于1的 自然数中,除了1和它本身以外不再有其他因数的数
判断10-105之间有多少个素数,并输出所有素数。【素数又称为质数,定义为在大于1的 自然数中,除了1和它本身以外不再有其他因数的数
45 0
|
算法 Java
旋转数组的最小数字(剑指offer 11)
把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素。例如,数组 [3,4,5,1,2] 为 [1,2,3,4,5] 的一个旋转,该数组的最小值为1。
旋转数组的最小数字(剑指offer 11)