您的位置:首页 > 其它

【沙茶了+筛选保存最大质因数】【HDU2136】Largest prime factor

2014-09-30 21:49 399 查看


Largest prime factor

Time Limit: 5000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)

Total Submission(s): 6990 Accepted Submission(s): 2471



Problem Description

Everybody knows any number can be combined by the prime number.

Now, your task is telling me what position of the largest prime factor.

The position of prime 2 is 1, prime 3 is 2, and prime 5 is 3, etc.

Specially, LPF(1) = 0.

Input

Each line will contain one integer n(0 < n < 1000000).

Output

Output the LPF(n).

Sample Input

1
2
3
4
5


Sample Output

0
1
2
1
3


Author

Wiskey

Source

HDU 2007-11 Programming Contest_WarmUp

Recommend

威士忌 | We have carefully selected several similar problems for you: 2133 2135 1215 2137 2134

我的思路 先打了素数表 再用二分查找去找最大的素数。。结果果断TLE了

代码在此:

#include<stdio.h>
int YNprime[1000001];
int prime[200000];
int totprime=1;
int getprime(int maxN)
{
int i,j,k;
for(i=2;i<=maxN;i++)
if(YNprime[i]==0)
{
prime[totprime++]=i;
for(j=2;i*j<=maxN;j++)
YNprime[i*j]=1;
}
return 1;
}
int find(int s,int t,int N)
{
int i;
int m=(s+t)/2;
if(s==t) return s;
if(prime[m]>N) return find(s,m,N);
if(prime[m]<N) return find(m+1,t,N);
else return m;
}
int main()
{
freopen("a.in","r",stdin);
freopen("a.out","w",stdout);
int n,i,ans,k;
getprime(1000000);
while(scanf("%d",&n)!=EOF)
{
ans=0;
if(n==1) {printf("0\n");continue;}
k=find(1,totprime-1,n);
for(i=k+10;i>=1;i--)
if(n%prime[i]==0)  {ans=i;break;}
printf("%d\n",ans);
}
return 0;
}
结果发现沙茶了

筛选法的时候就能直接找最大的素数

#include <cstdio>
#include <iostream>

using namespace std;

#define Maxl 1000005
int prime[Maxl];
int rank[Maxl];
int main()
{
int k = 0, i, j;
for (i =2; i < Maxl; i++)
{
if (prime[i] == 0)
{
rank[i] = ++k;
for (j = i; j < Maxl; j += i)
{
prime[j] = i;
}
}
}
prime[1] = 0;
int n;
while(scanf("%d", &n) == 1)
{
if(n == 1)
{
printf("0\n");
continue;
}
int k = prime
;
printf("%d\n", rank[k]);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: