关于代码中的maxn变量,它实际上是和输入的n是同一量级,或者说直接可以等于n;但和普通素数求法一样,sqrt(n)就可以解决问题。
知识点一:
筛除法原理:若n为素数,那他的n
×
\times
× 2,n
×
\times
× 3等等,就都不是素数,在之后的筛查就直接跳过。至于为何从j
×
\times
× j开始,是因为从j
×
\times
× 2开始,会有好多数重复计算。
知识点二:
vector变量做形参。有两种形式
1.地址形式,除在形参处加地址符外别无区别,见最终代码。
2.指针形式,形参处加指针符号*,实参处传地址&,使用时要用指针操作->
void initial(vector<int>*prime){
bool isPrime[200];
for(int i = 0;i<n;i++){
isPrime[i] = true;
}
isPrime[0] = false;
isPrime[1] = false;
for(int j = 2;j<n;j++){
if(!isPrime[j])
continue;
prime->push_back(j);//只能用指针操作
for(int k = j*j;k<n;k += j){
isPrime[k] = false;
}
}
}
int main(){
vector<int>prime;
initial(&prime);
......
}
最终代码,形参形式
#include<iostream>
#include<cstdio>
#include<vector>
#include<cmath>
using namespace std;
const int maxn = sqrt(1e4) +1;
void initial(vector<int>&prime){
bool isPrime[maxn];
for(int i = 0;i<maxn;i++){
isPrime[i] = true;
}
isPrime[0] = false;
isPrime[1] = false;
for(int j = 2;j<maxn;j++){
if(!isPrime[j])
continue;
prime.push_back(j);
for(int k = j*j;k<maxn;k += j){
isPrime[k] = false;
}
}
}
int main(){
vector<int>prime;
int n;
initial(prime);
while(scanf("%d",&n) != EOF){
int anwser = 0;
for(int i = 0;i<prime.size() && prime[i] < n;i++)
{
int factor = prime[i];
while(n%factor == 0){
n /= factor;
anwser++;
}
}
if(n != 1)
anwser++;
printf("%d\n",anwser);
}
return 0;
}