统计素数

该博客主要介绍如何计算1到给定正整数n之间素数的个数,提供了一个样例输入10,并给出了对应的素数个数4作为输出。

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

题目描述

输入一个正整数 n n n,统计 1 ∼ n 1 \sim n 1

### C++ 统计素数功能的实现 在 C++ 中,可以通过编写函数来判断某个整数是否为素数,并进一步利用该函数统计一定范围内的素数数量。以下是基于引用中的代码逻辑以及标准算法设计的一个完整解决方案。 #### 判断素数的函数 为了提高效率,通常会采用平方根优化的方式减少不必要的运算次数。以下是一个典型的 `is_prime` 函数: ```cpp bool is_prime(int num) { if (num <= 1) return false; // 小于等于1的数不是素数 if (num == 2 || num == 3) return true; // 特殊情况处理 if (num % 2 == 0 || num % 3 == 0) return false; // 排除偶数和能被3整除的情况 for (int i = 5; i * i <= num; i += 6) { // 跳过明显不可能的因子 if (num % i == 0 || num % (i + 2) == 0) return false; } return true; } ``` 此函数通过排除小于等于1的数值、特殊的小素数(如2和3),并跳过一些显然不成立的条件,从而显著提升性能[^1]。 #### 主程序部分 下面展示了一个完整的主程序框架,用于输入一个上限值 `n` 并输出范围内所有素数的数量: ```cpp #include <iostream> #include <cmath> // 使用sqrt函数需引入cmath库 using namespace std; // 定义判断素数的函数 bool is_prime(int num) { if (num <= 1) return false; if (num == 2 || num == 3) return true; if (num % 2 == 0 || num % 3 == 0) return false; for (int i = 5; i * i <= num; i += 6) { if (num % i == 0 || num % (i + 2) == 0) return false; } return true; } int main() { int n, count = 0; cout << "请输入统计素数的最大范围:"; cin >> n; for (int i = 2; i <= n; ++i) { if (is_prime(i)) { count++; } } cout << "在1到" << n << "之间共有:" << count << "个素数。" << endl; return 0; } ``` 上述代码实现了从用户处接收最大范围 `n` 的输入,随后遍历 `[2,n]` 所有整数并通过调用 `is_prime()` 来逐一验证其是否为素数,最终打印总数[^2]。 #### 性能改进建议 当面对更大的数据规模时,原始逐一遍历加单次判定的方法可能显得低效。此时可考虑 **埃拉托斯特尼筛法** 或者更高级别的线性筛法以加速筛选过程。例如: ```cpp void sieve_of_eratosthenes(int max_num, vector<bool>& primes) { primes.assign(max_num + 1, true); primes[0] = primes[1] = false; // 初始化0和1都不是质数 for (int p = 2; p * p <= max_num; ++p) { if (primes[p]) { for (int multiple = p * p; multiple <= max_num; multiple += p) { primes[multiple] = false; } } } } int main() { int n; cout << "请输入统计素数的最大范围:"; cin >> n; vector<bool> primes; sieve_of_eratosthenes(n, primes); int count = 0; for (int i = 2; i <= n; ++i) { if (primes[i]) count++; } cout << "在1到" << n << "之间共有:" << count << "个素数。" << endl; return 0; } ``` 这种方法预先构建好整个区间上的布尔数组标记哪些位置对应的是素数,后续只需简单扫描即可得到结果,极大提升了运行速度[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值