文章目录
前言
复习acwing算法基础课的内容,本篇为讲解数学知识:质数,关于时间复杂度:目前博主不太会计算,先鸽了,日后一定补上。
一、质数,质因数
质数即素数,指在大于1的自然数中,除了1和该数自身外,无法被其他自然数整除的数。约数(又称因数)是指若整数a除以整数b(b≠0)除得的商正好是整数而没有余数,就说a能被b整除,或b能整除a,其中a称为b的倍数,b称为a的约数。每个合数都可以写成几个质数相乘的形式,这几个质数就都叫做这个合数的质因数
二、例题,代码
AcWing 866. 试除法判定质数
本题链接:AcWing 866. 试除法判定质数
本博客提供本题截图:
AC代码
#include <cstdio>
using namespace std;
bool f(int n)
{
if (n < 2) return false;
for (int i = 2; i <= n / i; i ++ )
if (n % i == 0) return false;
return true;
}
int main()
{
int m, n;
scanf("%d", &m);
while (m -- )
{
int n;
scanf("%d", &n);
if (f(n)) puts("Yes");
else puts("No");
}
return 0;
}
AcWing 867. 分解质因数
本题链接:AcWing 867. 分解质因数
本博客提供本题截图:
本题解析:
分解质因数的结果为把一个数化成下图形式:
AC代码
#include <iostream>
#include <algorithm>
using namespace std;
void divide(int x)
{
for (int i = 2; i <= x / i; i ++ )
if (x % i == 0)
{
int s = 0;
while (x % i == 0) x /= i, s ++ ;
cout << i << ' ' << s << endl;
}
if (x > 1) cout << x << ' ' << 1 << endl;
cout << endl;
}
int main()
{
int n;
cin >> n;
while (n -- )
{
int x;
cin >> x;
divide(x);
}
return 0;
}
AcWing 868. 筛质数
本题链接:AcWing 868. 筛质数
本博客提供你本题截图:
诶氏筛法
#include <iostream>
#include <algorithm>
using namespace std;
const int N= 1000010;
int primes[N], cnt;
bool st[N];
void get_primes(int n)
{
for (int i = 2; i <= n; i ++ )
{
if (st[i]) continue;
primes[cnt ++ ] = i;
for (int j = i + i; j <= n; j += i)
st[j] = true;
}
}
/*void get_primes(int n)
{
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;
}
}
}*/
int main()
{
int n;
cin >> n;
get_primes(n);
cout << cnt << endl;
return 0;
}
线性筛法
#include <iostream>
#include <algorithm>
using namespace std;
const int N= 1000010;
int primes[N], cnt;
bool st[N];
/*void get_primes(int n)
{
for (int i = 2; i <= n; i ++ )
{
if (st[i]) continue;
primes[cnt ++ ] = i;
for (int j = i + i; j <= n; j += i)
st[j] = true;
}
}
*/
void get_primes(int n)
{
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;
}
}
}
int main()
{
int n;
cin >> n;
get_primes(n);
cout << cnt << endl;
return 0;
}
三、时间复杂度
关于质数各步操作的时间复杂度以及证明,后续会给出详细的说明以及证明过程,目前先鸽了。