C++质数的那些事(判断指数、区间筛质数、互质等等)

26 篇文章 0 订阅
26 篇文章 0 订阅

质数的定义:若一个正整数除了1和它自身之外不能被任何自然数整除,则该数称为质数,也叫素数。否则为合数

质数的性质:质数的分布较为稀疏,对于一个足够大的数S,不超过S的质数大约有\frac{N}{InN}个,也就是说每InN个数约有一个质数,

一、判断一个整数是否是指数

代码:

#include<iostream>

using namespace std;

//判断传入整数是否为质数的自定义函数
bool isprime(int num)
{
    //特殊质数2单独判断
	if(num==2)
	    return true;

	//偶数与特殊的数进行过滤
	if(num%2==0 || num<2)
	    return false;

	else
        {
		for(int i=3;i*i<=num;i+=2)
		{
			if(num%i==0)
			{
				return false;
			}
		}
		return true;
	}
}
int main()
{
	int x;cin>>x;

	//自定义函数isprime(x)
	//整数x是质数返回true
	//整数x不是质数返回false
	if(isprime(x))
        {
		cout<<"Yes";
        }
	else
        {
	    cout<<"No";
        }
	return 0;
}

二、筛出给定区间的质数

代码(欧拉筛(线性筛)):

#include<iostream>
#include<cstring>

const int N=1e4+10;

using namespace std;

bool ss[N];

int main()
{
    //筛选出[0,n]区间的素数; 
	int n;cin>>n;
    int pr[N];
	int cnt=0;
	
	//先初始化所有数都是素数 
    memset(ss,true,sizeof(ss));
    
    //排除0,1; 
    ss[0]=ss[1]=false;
    
    for(int i=2;i<n;i++) 
	{
	    
    //选出素数
      if(ss[i]) pr[cnt++] = i;    
      
      for(int j=0;j<cnt&&pr[j]*i<=n;j++)
	  {
	      
    //筛出非素数
      ss[pr[j]*i]=false;      
      
    //重复筛选,跳出循环
      if(i%pr[j]==0) break; 
      }
    }
    for(int i=0;i<=n;i++) 
	if(ss[i]) cout<<i<<" "; 
	
	return 0;
} 

三、判断两个整数是否互质

代码:

#include<iostream>
#include<cstring>

const int N=1e4+10;

using namespace std;

bool ss[N];

int gcd(int a,int b)
{
	return b ? gcd(b, a % b) : a;
}

bool coprime(int a, int b) 
{
	return gcd(a, b) == 1;
}

int main()
{
    int x,y;cin>>x>>y;
    if(coprime(x,y))
        cout<<"Yes"<<endl;
    else
        cout<<"No"<<endl;

	return 0;
}

代码会随个人学习进行持续更新,谢谢您的观看!

  • 6
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
AKS算法是一种判断素数的算法,它的时间复杂度是多项式级别的,比传统的素数判定算法要快很多。下面是用C++实现AKS算法判断素数的代码: ```c++ #include <iostream> #include <cmath> using namespace std; // 模幂运算 long long fastPow(long long a, long long b, long long mod) { long long res = 1; while (b > 0) { if (b & 1) { res = (res * a) % mod; } a = (a * a) % mod; b >>= 1; } return res; } // 判断是否是素数 bool isPrime(long long n) { if (n <= 1) { return false; } // 寻找r long long r = 2; while (r <= sqrt(n) && n % r != 0) { r++; } if (r <= sqrt(n)) { return false; } // 判断是否满足AKS条件 for (long long a = 2; a <= sqrt(n); a++) { if (fastPow(a, n, n+1) != (a % (n+1))) { return false; } } return true; } int main() { long long n; cout << "请输入一个正整数:" << endl; cin >> n; if (isPrime(n)) { cout << n << "是素数" << endl; } else { cout << n << "不是素数" << endl; } return 0; } ``` 在这个代码中,我们使用了模幂运算和AKS算法判断给定的数n是否是素数。模幂运算用来计算a^n mod m,AKS算法则是一个基于多项式的算法,它的核心思想是利用多项式同余来判断一个数是否是素数。 首先,我们先找到一个r,使得r是n的最小质因子。然后,我们判断是否满足以下条件: 1. n=ak,其中k≥2 2. 对于所有1≤a<r,a与n互质或a^n ≡ a (mod n) 3. r>n^(1/2) 如果这些条件都满足,那么n就是素数。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值