地址:http://acm.hdu.edu.cn/showproblem.php?pid=2136
题意:问一个数n最大的素因子是第几个素数。
mark:之前一直TLE。素数表不打好会TLE,分解素因子的时候不加sqrt优化也会TLE。。。
先打好100w的素数表,把素数的位序标记好,然后从1到sqrt(n)分解n,得到n最大的素因子后,再看是第几个。
代码:
# include <stdio.h>
# include <math.h>
int IsPrime[1000010] ;
int Primes[1000010] ;
int cnt = 0 ;
void init()
{
int i, j ;
for(i = 1 ; i <= 1000000 ; i++) IsPrime[i] = 1 ;
for(i = 2 ; i <= 1000 ; i++)if (IsPrime[i])
{
for (j = i*i ; j <= 1000000 ; j+=i)
IsPrime[j] = 0 ;
}
for(i = 1 ; i <= 1000000 ; i++) if (IsPrime[i])
{
IsPrime[i] = cnt ;
Primes[cnt++] = i ;
}
}
int calc(int n)
{
int i, lim = sqrt(n)+1, rtn = 0 ;
for(i = 1 ; Primes[i] <= lim && n != 1; i++)
{
while (n%Primes[i] == 0)
{
n/=Primes[i] ;
rtn = i ;
}
}
if (n == 1) return rtn ;
return IsPrime[n] ;
}
int main ()
{
int n ;
init() ;
while (~scanf ("%d", &n))
printf ("%d\n", calc(n)) ;
return 0 ;
}