这个题放寒假的时候做过,今天无意看到又做了一遍。
题目大意是求给定数最大素因数在素数表中的位置。
最大素因数: 素数的最大素因数是自身,非素数(>1)的最大素因数就是因数中最大的素数,比如4的最大素因数是2,5的最大素因数是5.
素数表: 表中第0个元素是1,然后是2,3,5,7,11.....
思路:快速素数筛求出1-100万间的素数,找出它们在表中的位置查询即可。
自己的代码
#include <cstdio>
#define MAXN 1000005
using namespace std;
int a[MAXN]; //为0表示是素数
void Init() {
int pos = 1; //素数在素数表中的位置
for(int i = 2;i <= MAXN;i++){
if(a[i] == 0){
a[i] = pos; //标记素数位置
for(int j = 2;j*i <= MAXN;j++)
a[i*j] = 1; //非素数
pos++;
}
}
}
int IsPrime(int x){ //判断素数
if(x == 1)
return 0;
if(x <= 3 && x > 1)
return 1;
for(int i = 2;i*i <= x;i++) {
if(x % i == 0)
return 0;
}
return 1;
}
int main(){
Init();
int n;
while(scanf("%d",&n) != EOF){
if(!IsPrime(n)) { //找出n的最大素因数
for(int i = 2;i*i <= n;i++){
if(n % i == 0){ //找到因数
while(!IsPrime(n) && n % i == 0)
n /= i;
}
}
}
printf("%d\n",a[n]);
}
return 0;
}
上面这份代码单独求了n的最大素因数,后来看了以前在HDOJ交的代码,发现有种更简洁的方法(当时看的不知道哪个大佬的代码..)
标记了很关键的那行代码,每次求出素数时,素数在表中位置为pos,把素数的倍数也标记为pos,这样可以记录下非素数的因数在表中位置,由于会从小到大一直找素数,所以可以标记处非素数的最大素因数在表中的位置
#include <cstdio>
#define MAXN 1000005
using namespace std;
int a[MAXN]; //为0表示是素数
void Init() {
int pos = 1; //素数在素数表中的位置
for(int i = 2;i <= MAXN;i++){
if(a[i] == 0){
a[i] = pos; //标记素数位置
for(int j = 2;j*i <= MAXN;j++)
a[i*j] = pos; //这里很关键
pos++;
}
}
}
int main(){
Init();
int n;
while(scanf("%d",&n) != EOF){
printf("%d\n",a[n]);
}
return 0;
}