用C++编写函数判别一个数是否是质数,在主程序中实现输入输出

本文分享了一段使用C++编写的简单程序,该程序能够接收用户输入的一个整数,并判断该整数是否为质数。通过一个名为prime的函数实现核心逻辑,采用递减循环的方式检查数字是否只能被1和其本身整除。

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

#include<iostream>
using namespace std;
int prime(int n)
{
if(n>1)
{
int i=n-1;
while(n%i!=0)
{
i--;
}
if(i==1)
return 1;
else return 0;
}
else return 0;
}
int main()
{
int a;
cout<<"请输入一个整数"<<endl;
while(1<2)
{
cin>>a;
if(prime(a)!=0)
cout<<a<<"是质数"<<endl;
else
cout<<a<<"不是质数"<<endl;
}
return 0;
}



### C++ 中素判定算法实现 #### 方法一:朴素筛法 朴素筛法是一种简单直观的方法来判断一个是否为素。该方法的时间复杂度大约为 O(n√n),适用于较小范围内的素检测。 ```cpp bool isPrime(int n) { if (n <= 1) return false; if (n == 2) return true; for (int i = 2; i * i <= n; ++i) { if (n % i == 0) return false; } return true; } ``` 这种方法通过遍历从 `2` 到 `sqrt(n)` 的所有整,检查是否存在能被 `n` 整除的情况[^2]。 #### 方法二:埃氏筛法(Eratosthenes Sieve) 埃氏筛法用于找出一定范围内所有的素,其核心思想是从第一个开始,将它的倍标记为合;接着找到下一个未被标记的作为新的素,并重复上述过程直到结束。此方法具有较高的效率,在处理较大区间时表现良好。 ```cpp const int MAXN = 1e6 + 7; bool not_prime[MAXN]; void sieveOfEratosthenes() { memset(not_prime, 0, sizeof(not_prime)); not_prime[0] = not_prime[1] = true; for (long long i = 2; i * i < MAXN; ++i) { if (!not_prime[i]) { for (long long j = i * i; j < MAXN; j += i) { not_prime[j] = true; } } } } ``` 这段代码实现了埃氏筛法的核心逻辑,能够有效地筛选出指定上限之内的全部素[^3]。 #### 方法三:线性筛法(欧拉筛) 相比于埃氏筛法,线性筛进一步提高了性能,几乎达到了理论上的最优——O(n) 复杂度。它利用了每个合仅由最小质因子乘以其余部分构成这一特性来进行高效过滤。 ```cpp const int N = 1e6; int primes[N], cnt; bool st[N]; void eulerSieve() { cnt = 0; for (int i = 2; i <= N; ++i) { if (!st[i]) primes[cnt++] = i; for (int j = 0; primes[j] <= N / i; ++j) { st[primes[j] * i] = true; if (i % primes[j] == 0) break; } } } ``` 以上三种方式分别代表了不同的应用场景和技术路线的选择,可以根据实际需求选用合适的方案。 #### 费马小定理判别法 基于费马小定理,即当 p 是质数且 a 不是 p 的倍时,满足 \(a^{(p-1)} \equiv 1 (\text{mod}\ p)\)[^4]。据此设计了一种快速检验大整可能成为素的概率测试: ```cpp #include<bits/stdc++.h> using namespace std; typedef unsigned long long ull; ull qpow(ull base, ull exp, const ull& mod){ ull res = 1; while(exp>0){ if(exp & 1)res=res*base%mod; base=base*base%mod; exp>>=1; } return res; } bool miller_rabin_test(const ull& n,int times){ if(n<2)return false; if(n==2||n==3)return true; if((n&1)==0)return false; ull d=n-1,s=0; while((d&1)==0)d>>=1,++s; mt19937 rng(random_device{}()); uniform_int_distribution<int>distr(2,n-2); for(int t=0;t<times;++t){ ull a=distr(rng); ull x=qpow(a,d,n),y=x; for(int r=0;r<s;++r){ y=(ull)(qpow(x,2LL,n)); if(y==1&&x!=1&&x!=(n-1))return false; x=y; } if(y!=1)return false; } return true; } ``` 注意这里的函数实际上包含了更复杂的米勒-拉宾测试而非单纯的费马小定理应用,因为后者存在一定的误报率,而前者则显著降低了这种风险。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值