目录
一、866 试除法判定质数
1和0不是质数
#include <iostream>
#include <algorithm>
using namespace std;
bool isprime(int x)
{
if (x<2) return false;
for (int i=2;i<=x/i;i++)
if (x % i == 0)
return false;
return true;
}
int main()
{
int n;
cin >> n;
while(n--)
{
int x;
cin>>x;
if(isprime(x)) puts("Yes");
else puts("No");
}
return 0;
}
二、867 分解质因数
n中最多只含有一个大于sqrt(n)的因子
先考虑比sqrt(n)小的,代码和质数的判定类似
最后如果n还是>1,说明这就是大于sqrt(n)的唯一质因子,输出即可
循环里面的 i 一定是一个质数:
假如 i 是一个合数,那么它一定可以分解成多个质因子相乘的形式,这多个质因子同时也是 a 的质因子且比 i 要小,而比 i 小的数在之前的循环过程中一定是被条件除完了的,所以 i 不可能是合数,只可能是质数
#include <iostream>
using namespace std;
void div(int x)
{
for(int i=2;i<=x/i;i++)
if(x%i==0) //i一定是质数
{
int cnt=0;
while(x%i==0)
{
x/=i;
cnt++;
}
cout<<i<<' '<<cnt<<endl;
}
if(x>1) cout<<x<<' '<<1<<endl;
}
int main()
{
int t;
cin>>t;
while(t--)
{
int x;
cin>>x;
div(x);
puts("");
}
return 0;
}
三、868 筛质数
1、朴素筛
void get_primes(int n)
{
for(int i=2;i<=n;i++)
{
if(!st[i]) primes[cnt++]=i; //把素数存起来
for(int j=i+i;j<=n;j+=i) 不管是合数还是质数 都用来筛掉后面它的倍数
st[j]=true;
}
}
2、埃氏筛
void get_primes(int n)
{
for(int i=2;i<=n;i++)
if(!st[i])
{
primes[cnt++]=i; //把素数存起来
for(int j=i;j<=n;j+=i) st[j]=true; //把该素数的倍数筛掉 用素数可以筛掉所有的合数
}
}
3、线性筛
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;
}
}
}