C++fish写了一个鉴别素数的程序

本文提供了一段C++程序代码,用于筛选1至1000范围内的所有素数,并详细展示了如何通过循环和条件判断来实现这一功能。
//鉴别1到1000以内的素数
#include <iostream>
using namespace std;

int main()
{
    int n = 2;
    cout<<"The prime number between 1 to 1000 are:"<<endl;
    while (n<=1000)
    {
        for (int i=2; i<n/2; i++)
        {
            if(n % i)//n不能被i整除,测试下一个i值(即i+1)
                continue;
            else//n可以被i整除,结束for循环,测试下一个n值
                goto a1;
        }
        cout<<n<<endl;
        a1:  n++;
    }

    return 0;
}

希望和大家多交流,谢谢

<think> 我们注意到用户之前的问题是关于多组测试用例的输入处理(a和b,遇0终止),但现在用户的问题转向了编一个判断素数C++程序。因此,我们将专注于后者的要求。 根据引用中的内容,我们看到了几种判断素数的常见方法: 1. 试除法:遍历2到num-1,或者优化到2到sqrt(num) 2. 利用6的倍数附近的性质:大于等于5的质数一定在6的倍数两侧(如5,7在6的两侧,11,13在12的两侧等),但这种方法需要先排除2和3。 3. 埃氏筛法:适用于求一定范围内的素数,但用户当前要求是判断单个素数。 考虑到用户要求编一个判断素数程序,我们选择一种高效且清晰的方法:试除法优化(遍历到平方根)。 程序步骤: 1. 输入一个整数n。 2. 判断特殊情况:如果n小于2,则不是素数;如果n等于2或3,则是素数。 3. 排除偶数:如果n是大于2的偶数,则不是素数(因为2是唯一的偶素数)。 4. 用循环从3开始,每次加2(跳过偶数),直到sqrt(n)(包含),判断是否有因子。 5. 若没有因子,则是素数。 注意:1不是素数,也不是合数(但题目要求判断素数,所以我们只需按素数定义:大于1且只能被1和自身整除)。 根据引用[4]中的代码,我们稍作改进,并采用C++。 我们将编一个函数isPrime(int n)来判断素数。 代码示例: </think> ### C++ 素数判断程序实现 以下是使用 C++ 实现的高效素数判断程序,结合了引用中的多种优化技术: ```cpp #include <iostream> #include <cmath> using namespace std; // 高效素数判断函数 bool isPrime(int num) { if (num <= 1) return false; // 小于等于1不是素数 if (num == 2 || num == 3) return true; // 2和3是素数 // 排除能被2或3整除的数 if (num % 2 == 0 || num % 3 == 0) return false; // 优化循环:检查6k±1形式的因子 int limit = static_cast<int>(sqrt(num)) + 1; for (int i = 5; i <= limit; i += 6) { if (num % i == 0 || num % (i + 2) == 0) { return false; } } return true; } int main() { cout << "请输入要判断的整数: "; int n; cin >> n; if (n == 1) { cout << "1既不是素数也不是合数" << endl; } else if (isPrime(n)) { cout << n << "是素数" << endl; } else { cout << n << "不是素数" << endl; } return 0; } ``` ### 算法优化说明 1. **基础排除法**: - 直接排除 $n≤1$ 的情况(第3行) - 单独处理小素数 $2$ 和 $3$(第4行) - 快速排除所有偶数和3的倍数(第7行) 2. **数学优化**: - **平方根上限**:只需检查 $≤\sqrt{n}$ 的因子(第10行) - **6k±1 定理**:所有大于3的素数都满足 $n≡±1 \pmod{6}$[^3] - **步长优化**:以6为步长检查 $6k±1$ 形式的因子(第11行) 3. **时间复杂度**: - 最坏情况:$O(\sqrt{n})$(当 $n$ 是素数时) - 平均情况:$O(\sqrt{n}/6)$(比普通试除法快6倍) ### 测试示例 | 输入 | 输出 | |------|------| | 1 | 1既不是素数也不是合数 | | 2 | 2是素数 | | 97 | 97是素数 | | 100 | 100不是素数 | ### 性能对比 方法 | 检查范围 | 时间复杂度 ---|---|--- 基础方法 | $2→n-1$ | $O(n)$ 平方根优化 | $2→\sqrt{n}$ | $O(\sqrt{n})$ 6k±1优化 | $\sqrt{n}/6$ 次迭代 | $O(\sqrt{n}/6)$
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值