c++prime

无符号和有符号共同算术处理会让有符号转化为无符号

无符号赋值负数,会导致结果为取余数

可否通过无符号的负数赋值来判断编辑环境的位数

### C++ 实现素数算法 #### 使用试除法判断单个整数是否为素数 对于给定的一个正整数n,如果它除了1和本身外没有任何其他因数,则该数被称为素数。下面是一个简单的C++程序来检测一个特定数值是不是质数: ```cpp #include <iostream> #include <cmath> bool isPrime(int n) { if (n <= 1) return false; for (int i = 2; i <= sqrt(n); ++i) { // 只需遍历到根号下n即可 if (n % i == 0) return false; } return true; } int main() { int num; std::cout << "Enter a positive integer: "; std::cin >> num; if(isPrime(num)) std::cout << num << " is a prime number."; else std::cout << num << " is not a prime number."; return 0; } ``` 这段代码通过尝试从2至平方根范围内的所有可能因子去除目标数字来进行工作[^1]。 #### 线性筛法求解一定范围内所有的素数 当需要找出小于某个上限N的所有素数时,可以采用埃拉托斯特尼筛法(Sieve of Eratosthenes),这是一种高效的筛选方法: ```cpp #include <vector> using namespace std; void sieveOfEratosthenes(int limit, vector<int>& primes){ bool marked[limit+1]; memset(marked,false,sizeof(marked)); for(long long p=2;p*p<=limit;++p){ if(!marked[p]){ for(long long j=p*p;j<=limit;j+=p) marked[j]=true; } } for(int k=2;k<=limit;++k){ if(!marked[k]) primes.push_back(k); } } // Example usage: /* vector<int> allPrimes; sieveOfEratosthenes(100,allPrimes); for(auto& elem : allPrimes) cout<<elem<<" "; */ ``` 上述实现利用布尔数组标记合数位置,并最终收集未被标记过的索引作为素数列表的一部分[^2]. #### 米勒-拉宾概率素性测试 米勒-拉宾(Miller-Rabin)是一种基于随机化的高效素性检验算法,适用于大整数的情况。虽然存在极小的概率会把某些合数误判成素数,但在实际应用中已经足够可靠。以下是其简化版本的伪代码转换而来的C++实现方式之一: ```cpp #include<bits/stdc++.h> typedef unsigned long long ull; ull powerModulo(ull base, ull exp, const ull &modulus){ ull result = 1; while(exp > 0){ if(exp%2==1)result=(result*base)%modulus; base=(base*base)%modulus; exp>>=1; } return result; } bool millerRabinTest(const ull &number,int iterations=5){ if(number<2)return false; if((number&1)==0 && number!=2)return false; ull d=number-1,s=0; while(d%2==0){d/=2;s++;} for(int iteration=0;iteration<iterations;++iteration){ ull witness=rand()%(number-3)+2,a=powerModulo(witness,d,number); if(a==1 || a==(number-1))continue; for(int r=0;r<s;++r){ a=powerModulo(a,2,number); if(a==(number-1))break; } if(a!=(number-1))return false; } return true; } ``` 此部分展示了如何运用快速幂取模运算以及多次迭代验证来完成一次完整的米勒-拉宾测试过程[^3].
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值