题目链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=520
解题思路:
简单的模拟题,有2种思路:
第一种暴力:
直接找到n的最大的素因子,然后找出最大素因子在素数表中出现的位置即可。
第二种:
在筛素数的同时进行处理,因为第二层需要更新可以整除prim[i],即当前最大素因子,所以可以在此更新。一次打表即可。
代码如下:
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<algorithm>
using namespace std;
#define N 1000010
int prim[N];
int ans[N];
void fun()
{
int limit = sqrt(N * 1.0);
memset(prim, 0, sizeof(prim));
memset(ans, 0, sizeof(ans));
for(int i = 2; i <= limit; ++i)
if(!prim[i])
for(int j = i * i; j < N; j += i)
prim[j] = 1;
int num = 0;
for(int i = 1; i < N; ++i)
if(!prim[i])
ans[i] = num++;
int temp = 0;
for(int i = 2; i < N; ++i)
if(!prim[i])
prim[temp++] = i;
}
int prim_induce(int n)
{
if(n == 1)
return 1;
int maxprim = 1;
for(int i = 0; prim[i] * prim[i] <= n; ++i)
{
if(n % prim[i] == 0)
{
maxprim = max(maxprim, prim[i]);
while(n % prim[i] == 0)
n /= prim[i];
}
if(n == 1)
break;
}
if(n != 1)
return n;
else
return maxprim;
}
int main()
{
int n;
fun();
while(~scanf("%d", &n))
printf("%d\n", ans[prim_induce(n)]);
return 0;
}
代码如下:
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<algorithm>
using namespace std;
#define N 1000010
int prim[N];
void fun()
{
for(int i = 2, temp = 0; i < N; ++i)
if(!prim[i])
{
temp++;
for(int j = i; j < N; j += i)
prim[j] = temp;
}
}
int main()
{
int n;
fun();
while(~scanf("%d", &n))
printf("%d\n", prim[n]);
return 0;
}