质数

质数

一、定义:

质数是指在大于1的自然数中,除了1和它本身以外不再有其他因数的自然数。

二、定理:

算术基本定理可表述为:任何一个大于1的自然数 N,如果N不为质数,那么N可以唯一分解成有限个质数的乘积N=〖p1〗^a1 〖p2〗^a2 〖p3〗a3…pnan,这里P1<P2<P3......<Pn均为质数,其中指数ai是正整数。这样的分解称为 N 的标准分解式。最早证明是由欧几里得给出的,由陈述证明。此定理可推广至更一般的交换代数和代数数论。

三、质数的判定

一般采用试除法。
从2试除到√n

#include<cstdlib>
#include<cmath>
#include<ctime>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
		int n;
		cin>>n;
		for(int i=2;i*i<=n;i++)  //cmath中sqrt函数效率不高 
		if(n%i==0) {
			cout<<"NO";
			return 0;
		} 
		cout<<"Yse";
		return 0;
}

四、筛素数

1.Eratosthenes筛选法
#include<cstdlib>
#include<cmath>
#include<ctime>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
int n,m;
bool v[100000];
void shai()
{
	for(int i=2;i<=n;i++)
	{
	if(v[i]) continue;
	cout<<i<<" ";
	for(int j=2;j*i<=n;j++)
	v[i*j]=1;
	}
}
int main()
{
		cin>>n;
		shai();
}
2.线性筛
#include<cstdlib>
#include<cmath>
#include<ctime>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
int n,m;
bool shu[10000000];
int prime[10000];
void shai()
{
	for(int i=2;i<=n;i++)
	{
	if(!shu[i])
	{
	prime[++m]=i;
	cout<<i<<" ";
	}
	for(int j=1;j<=m;j++)
	{
	shu[prime[j]*i]=1;
	if(i%prime[j]==0)
	break;
	}
	}
}
int main()
{
		cin>>n;
		shai();
}

五、质因数分解

#include<cstdlib>
#include<cmath>
#include<ctime>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
int p[10000],c[1000];
int main() {
	int n,i=2,m=0;
	cin>>n;
	while(n!=1) {
		if(n%i==0) {
			n/=i;
			p[++m]=i;
			c[m]++;
			while(n%i==0) {
				c[m]++;
				n/=i;
			}
		}
		i++;
	}
	for(int i=1; i<m; i++)
		cout<<p[i]<<"^"<<c[i]<<"*";
	cout<<p[m]<<"^"<<c[m];
}

又水了一篇博客
2021-03-21 星期日

posted @ 2021-03-21 14:55  S_Curry  阅读(333)  评论(0编辑  收藏  举报