一、质数
1. 概念
质数又称素数。一个大于1的自然数,除了1和它自身外,不能被其他自然数整除的数叫做质数,否则称为合数。
- 规定1既不是质数也不是合数
- 质数的个数是无穷的
2. 例题:AcWing 3497 质数
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 i∗i<=n:要注意i的平方是否会溢出
#include <iostream>
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 质因子
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 <iostream>
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;
}