C++素数

这段代码实现了一个简单的算法,用于找出100到200之间的所有素数。通过检查每个奇数是否能被2到其平方根之间的任何数整除,确定它们的素数身份,并每隔四个数换行显示结果。

输出100~200的素数

首先都是奇数,只要能被2~根号m之间的任何一个数整除,就不是素数,false,退出 

#include<bits/stdc++.h>
using namespace std;
int main(){
    bool flag;
    int m; 
    int n=0;
    for(m=101;m<=200;m=m+2){
        flag=true;
        int k=int(sqrt(m));
        for(int i=2;i<=k;i++){
            if(m%i==0) flag=false;break;
            
        }
    if(flag) cout<<setw(5)<<m;n=n+1;
    if(n%4==0) cout<<endl;//输入四个数后换行 
    }
    return 0;

 

### C++素数判定算法的实现 以下是基于提供的引用内容以及专业知识整理的一个完整的 C++ 程序来判断一个数是否为素数: #### 基本方法:试除法 通过遍历从 `2` 到 `sqrt(n)` 的所有整数,检查是否存在能被 `n` 整除的情况。如果存在,则说明该数不是素数。 ```cpp #include <iostream> #include <cmath> // 使用 sqrt 函数 bool isPrime(int n) { if (n < 2) { // 小于 2 的数都不是素数 return false; } for (int i = 2; i <= std::sqrt(n); ++i) { // 遍历到根号 n 即可 if (n % i == 0) { // 如果可以整除则返回 false return false; } } return true; // 否则是素数 } int main() { int n; std::cout << "请输入一个正整数:"; std::cin >> n; if (isPrime(n)) { std::cout << n << " 是素数。" << std::endl; } else { std::cout << n << " 不是素数。" << std::endl; } return 0; } ``` 此代码实现了基本的素数检测逻辑[^1]。 --- #### 更高效的优化版本 为了进一步提高效率,在循环中只需要考虑奇数即可(因为偶数除了 `2` 外都不可能是素数)。因此可以从 `3` 开始并以步长为 `2` 进行迭代。 ```cpp #include <iostream> bool isPrimeOptimized(int n) { if (n <= 1) { // 排除非正整数 return false; } if (n == 2 || n == 3) { // 特殊情况处理 return true; } if (n % 2 == 0 || n % 3 == 0) { // 排除小于等于根号 n 的因子 return false; } for (int i = 5; i * i <= n; i += 6) { // 跳过不必要的偶数和倍数 if (n % i == 0 || n % (i + 2) == 0) { return false; } } return true; } int main() { int n; std::cout << "请输入一个正整数:"; std::cin >> n; if (isPrimeOptimized(n)) { std::cout << n << " 是素数。" << std::endl; } else { std::cout << n << " 不是素数。" << std::endl; } return 0; } ``` 上述代码采用了更少的迭代次数,从而提高了性能[^3]。 --- #### 概率算法:Miller-Rabin 方法 对于非常大的数值,传统的试除法可能变得低效。此时可以采用 **Miller-Rabin** 概率算法来进行快速验证。虽然它是一个概率算法,但在实际应用中可以通过多次测试显著降低错误的概率。 ```cpp #include <bits/stdc++.h> using namespace std; // 快速幂运算函数 long long mod_pow(long long base, long long exp, long long modulus) { long long result = 1; while (exp > 0) { if (exp % 2 == 1) { result = (__int128(result) * base) % modulus; } base = (__int128(base) * base) % modulus; exp /= 2; } return result; } // Miller-Rabin 测试单次运行 bool miller_rabin_test(long long d, long long s, long long n, long long a) { long long x = mod_pow(a, d, n); if (x == 1 || x == n - 1) { return true; } for (long long r = 1; r < s; ++r) { x = (__int128(x) * x) % n; if (x == n - 1) { return true; } } return false; } // 主体 Miller-Rabin 测试 bool is_prime_miller_rabin(long long n, int k = 5) { if (n <= 1) return false; if (n <= 3) return true; if (n % 2 == 0 || n % 3 == 0) return false; long long d = n - 1; long long s = 0; while (d % 2 == 0) { d /= 2; s++; } for (int i = 0; i < k; ++i) { long long a = rand() % (n - 4) + 2; if (!miller_rabin_test(d, s, n, a)) { return false; } } return true; } int main() { long long n; cout << "请输入一个大整数:"; cin >> n; if (is_prime_miller_rabin(n)) { cout << n << " 很有可能是素数。" << endl; } else { cout << n << " 不是素数。" << endl; } return 0; } ``` 以上程序展示了如何利用 **Miller-Rabin** 算法高效地检验超大规模整数是否为素数[^4]。 --- ### 总结 三种不同的方法分别适用于不同场景下的需求: - 对较小范围内的数据使用简单的试除法; - 对稍大数据集进行优化后的试除法; - 当面对极大数值时推荐使用概率性的 **Miller-Rabin** 算法
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值