【数学知识】质数与质因子

一、质数

1. 概念

  质数又称素数。一个大于1的自然数,除了1和它自身外,不能被其他自然数整除的数叫做质数,否则称为合数。

  • 规定1既不是质数也不是合数
  • 质数的个数是无穷的

2. 例题:AcWing 3497 质数

【数学知识】质数与质因子_第1张图片

3. 代码:

  判断质数时for循环的停止条件可以有几种形式:

  • i < = n / i i<=n/i i<=n/i
  • i < = s q r t ( n ) i<=sqrt(n) i<=sqrt(n):相较第一种运算速度慢
  • i ∗ i < = n i*i<=n ii<=n:要注意i的平方是否会溢出
#include 
using namespace std;

/* AcWing 3497 质数 */

const int maxn = 1e4 + 10;
int p[maxn];
void getPrime(){
	p[1] = 2;
	int n = 3, i = 2;
	while(i <= 1e4){
		int flag = 0; 
		for(int i = 2; i <= n / i; i++){
			if(n % i == 0){
				flag = 1;
				break;
			}
		}
		if(!flag) p[i++] = n;
		n++;
	}
}

int main(){
	getPrime();
	int k;
	while(cin >> k)
		cout << p[k] << "\n";
	return 0;
} 

二、质因子

1. 概念

  每个合数都可以写成几个质数相乘的形式,其中每个质数都是这个合数的因数,即质因子。把一个合数用质因数相乘的形式表示出来,叫做分解质因数,如30=2×3×5 。

  • 两个没有共同质因子的正整数称为 互质。因为1没有质因子,1与任何正整数(包括1本身)都是互质。
  • 分解质因数只针对合数。
  • 对于任意一个合数,都可以用几个质数幂的乘积表示。

2. 例题:AcWing 1545 质因子

【数学知识】质数与质因子_第2张图片

3. 代码:

  先使用 f o r for for循环在 2 2 2~ n \sqrt n n 的范围内寻找质数因子,结束循环后还要判断是否 n = 1 n=1 n=1,若 n > 1 n>1 n>1 n n n还有一个大于 n \sqrt n n 的质数因子。

#include 
using namespace std;

/* AcWing 1545 质因子 */

int main(){
    int n;
    cin >> n;
    cout << n << "=";
    if(n == 1) cout << n; 
    //1.在2~n/i内寻找质因子,相较在2~n内寻找,可避免超时 
    for(int i = 2; i <= n/i; i++){
    	int tmp = 0, flag = 0;
        while(n % i == 0){ // 不用判断i是否为质数
        	flag = 1;
            ++tmp;
            n = n / i;    			       
        }
        if(flag){
        	cout << i;
        	if(tmp > 1)
        		cout << "^" << tmp;
        	if(n != 1)
        		cout << "*";
		}        	
    }
    //2.由于寻找范围是2~n/i,最终n可能不为1 
    if(n != 1)
    	cout << n;
    
    return 0;
}

三、埃氏筛法和欧式筛法(待做)

欧式筛法
素数筛法

你可能感兴趣的:(算法与数据结构,蓝桥杯,数据结构,算法)