第二次课-唯一分解定理+埃氏筛
唯一分解定理(分解质因数)
模板(函数):
void calc(int n)
{
for(int i=2;i<=n/i;i++)
{
while(n%i==0)
{
cout<<i<<" ";//注:此处输出格式因题而异
n/=i;
}
}
if(n>1)
{
cout<<n;
}
}
原理
1.第一重循环:最小的质数为2,所以从2开始试,由于因子是一对一对地出现,所以试到n/i就行了
2.while循环:要一直模到不能再模才能把后面此质数的倍数都删掉。顺路提一嘴,凡是能进入while循环都是质数,因为如果不是,早已在前面删掉了
3.除法:当n将i给除掉时,已经将其倍数都去掉了
4.if判断:如果n是质数,就会在此输出,因为它一直没被除掉
埃氏筛(找到所有质数)
运行次数:log(2)=1
log(4)=2
log(8)=3
log(16)=4
·
·
·
1/1+1/2+1/3+...+1/n =log(n)
模板(函数):
bool cz[105];
int sz[105];
int cnt=0;
void getprimes(int n)
{
cz[0]=1;
cz[1]=1;
for(int i=2;i<=n;i++)
{
if(cz[i]==0)
{
for(int i=2*i;i<=n;i+=i)
{
cz[i]=1;
}
sz[++cnt]=i;
}
}
}
原理
1.将第一项与第二项变为1:0和1既不是质数,也不是合数,所以为1
2.if判断:为0时说明为质数
3.第二重for循环:是i的倍数的数必为合数,所以都为1
4.将i存入sz数组: 这行代码与 cnt++; sz[cnt]=i; 相同