题目一 质数的判定
题解
- 判断是否小于2;
- 遍历从2到sqrt(a),判断是否能整除;
代码实现
#include<iostream>
#include<algorithm>
#include<cmath>
using namespace std;
void is_prime(int x)
{
if(x < 2)
{
cout << "No" << endl;
return ;
}
int sq = sqrt(x);
for(int i = 2;i <= sq;i ++ )
{
if(x % i == 0)
{
cout << "No" << endl;
return ;
}
}
cout << "Yes" << endl;
}
int main()
{
int n, a;
cin >> n;
while(n -- )
{
scanf("%d", &a);
is_prime(a);
}
return 0;
}
题目二 分解质因数
题解
- 遍历从2到sqrt(n),判断能否整除;
- 能整除则将n循环整除求指数;
- 若除完后n大于1,则证明其为质数,输出本身即可;
代码实现
#include<iostream>
#include<algorithm>
#include<cmath>
using namespace std;
void divi(int n)
{
int sq = sqrt(n);
for(int i = 2;i <= sq;i ++ )
{
if(n % i == 0)
{
int s = 0;
while(n % i == 0)
{
n /= i;
s ++ ;
}
printf("%d %d\n", i, s);
}
}
if(n > 1)
{
printf("%d %d\n", n, 1);
}
cout << endl;
}
int main()
{
int n;
cin >> n;
int a;
while(n -- )
{
scanf("%d", &a);
divi(a);
}
return 0;
}
题目三 筛质数
埃式筛法
题解思路
- 从小到大遍历所有点,删除掉其中质数的倍数;
- 剩下的未被删除的就是质数;
代码实现
#include<iostream>
#include<algorithm>
using namespace std;
const int N = 1e6 + 10;
bool st[N];
int cnt;
int main()
{
int n;
cin >> n;
for(int i = 2;i <= n;i ++ )
{
if(!st[i])
{
cnt ++ ;
for(int j = i * 2;j <= n;j += i)
{
st[j] = true;
}
}
}
cout << cnt;
return 0;
}
线性筛法(最快)
题解思路
- 从小到大遍历所有数,并判断是否被筛掉(是否为质数);
- 若没有被筛掉,则放入数组中,同时结果++;
- 只用最小的质数去筛掉其他数(最小的质数的倍数);
代码实现
#include<iostream>
#include<algorithm>
#include<cmath>
using namespace std;
const int N = 1e6 + 10;
bool st[N];
int cnt;
int prime[N];
int main()
{
int n;
cin >> n;
for(int i = 2;i <= n;i ++ )
{
if(!st[i])
{
prime[cnt ++ ] = i;
}
for(int j = 0;prime[j] <= n / i;j ++ )
{
st[prime[j] * i] = true;
if(i % prime[j] == 0)//如果不是i的最小的质数,则跳出循环;
{
break;
}
}
}
cout << cnt;
return 0;
}
具体代码解释
原链接:https://www.acwing.com/solution/content/100707/