【C++练习】06.输出100以内的所有素数

目录

  • 输出100以内的所有素数
    • 方法1:基础判断法
    • 方法2:埃拉托斯特尼筛法(效率更高)
    • 方法3:优化版筛法(只考虑奇数)
    • 方法4:使用STL算法
    • 方法5:递归实现
    • 总结:

输出100以内的所有素数

方法1:基础判断法

cpp 复制代码
#include <iostream>
using namespace std;

bool isPrime(int n) {
    if (n <= 1) return false;
    for (int i = 2; i * i <= n; i++) {
        if (n % i == 0) return false;
    }
    return true;
}

int main() {
    for (int i = 2; i <= 100; i++) {
        if (isPrime(i)) {
            cout << i << " ";
        }
    }
    return 0;
}

方法2:埃拉托斯特尼筛法(效率更高)

cpp 复制代码
#include <iostream>
#include <vector>
using namespace std;

void sieveOfEratosthenes(int n) {
    vector<bool> prime(n + 1, true);
    prime[0] = prime[1] = false;
    
    for (int p = 2; p * p <= n; p++) {
        if (prime[p]) {
            for (int i = p * p; i <= n; i += p) {
                prime[i] = false;
            }
        }
    }
    
    for (int p = 2; p <= n; p++) {
        if (prime[p]) {
            cout << p << " ";
        }
    }
}

int main() {
    sieveOfEratosthenes(100);
    return 0;
}

方法3:优化版筛法(只考虑奇数)

cpp 复制代码
#include <iostream>
#include <vector>
using namespace std;

void optimizedSieve(int n) {
    if (n >= 2) cout << "2 ";
    
    int size = (n - 1) / 2;
    vector<bool> prime(size, true);
    
    for (int i = 0; i < size; i++) {
        if (prime[i]) {
            int p = 2 * i + 3;
            cout << p << " ";
            for (int j = p * p; j <= n; j += 2 * p) {
                prime[(j - 3) / 2] = false;
            }
        }
    }
}

int main() {
    optimizedSieve(100);
    return 0;
}

方法4:使用STL算法

cpp 复制代码
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

bool isPrime(int n) {
    if (n <= 1) return false;
    for (int i = 2; i * i <= n; i++) {
        if (n % i == 0) return false;
    }
    return true;
}

int main() {
    vector<int> numbers(99);
    iota(numbers.begin(), numbers.end(), 2);
    
    numbers.erase(
        remove_if(numbers.begin(), numbers.end(), 
                 [](int n) { return !isPrime(n); }),
        numbers.end()
    );
    
    for (int n : numbers) {
        cout << n << " ";
    }
    
    return 0;
}

方法5:递归实现

cpp 复制代码
#include <iostream>
using namespace std;

bool isPrime(int n, int i = 2) {
    if (n <= 2) return (n == 2);
    if (n % i == 0) return false;
    if (i * i > n) return true;
    return isPrime(n, i + 1);
}

int main() {
    for (int i = 2; i <= 100; i++) {
        if (isPrime(i)) {
            cout << i << " ";
        }
    }
    return 0;
}

总结:

  • 基础判断法简单直观,适合小范围素数判断
  • 筛法在大数据量时效率更高
  • STL版本展示了C++标准库的使用
  • 递归版本展示了另一种思维方式

输出结果都是100以内的素数:

复制代码
2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97
相关推荐
devmoon4 小时前
为 Pallet 搭建最小化 Mock Runtime 并编写单元测试环境
开发语言·单元测试·区块链·智能合约·polkadot
9呀4 小时前
【ros2】OccupancyGrid消息里的resolution
人工智能·机器人
Physicist in Geophy.4 小时前
一维波动方程(从变分法角度)
线性代数·算法·机器学习
im_AMBER4 小时前
Leetcode 115 分割链表 | 随机链表的复制
数据结构·学习·算法·leetcode
Coder_Boy_4 小时前
Java开发者破局指南:跳出内卷,借AI赋能,搭建系统化知识体系
java·开发语言·人工智能·spring boot·后端·spring
Liue612312314 小时前
【YOLO11】基于C2CGA算法的金属零件涂胶缺陷检测与分类
人工智能·算法·分类
熵减纪元4 小时前
人形机器人周末炸场:Atlas后空翻回归、宇树零下47度暴走、中国Bolt跑出10m/s | 2.8日报
人工智能·机器人·人形机器人
!!!!8134 小时前
蓝桥备赛Day1
数据结构·算法
Mr_Xuhhh4 小时前
介绍一下ref
开发语言·c++·算法
硅谷秋水4 小时前
REALM:用于机器人操作泛化能力的真实-仿真验证基准测试
人工智能·机器学习·计算机视觉·语言模型·机器人