杭电OJLargest prime factor

题目链接:User Login

Largest prime factor

Time Limit: 5000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 8160 Accepted Submission(s): 2477

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

威士忌

我原来的代码总是发生超时:

#include <stdio.h>
#include <math.h>
#include <string.h>
int T,s[1000000],ss[79000];
int LK_ss(int a)
{
  for(int i=2;i<=sqrt(a);i++)
  {
    if(a%i==0) {return 0;}
  }
  return 1;
}
int main()
{
  int a;
  double b;
  T=0;
  for(int i=1;i<1000000;i++)
    {
      if(LK_ss(i)==1)
      {
        s[i]=T;
        ss[T]=i;
        T++;
      }
      else s[i]=T-1;
    }
  while (scanf("%d",&a)!=EOF)
  {
    if(ss[s[a]]==a)
    {
      printf("%d\n",s[a]);
    }
    else
    {
      for(int i=s[ss[s[a/2]]];i>=0;i--)
      {
        if(a%ss[i]==0)
        {
          printf("%d\n",i);break;
        }
      }
    }
  }
  return 0;                                                   
}

于是通过查找,找到了更高效的素数筛选法三种素数筛选法详解 (转)_暗淡的时光-CSDN博客_素数筛选法

于是改进代码:

#include <stdio.h>
#include <math.h>
#include <string.h>
int T,s[1000000],ss[79000];
int main()
{
  int a;
  double b;
  T=0;
  for(int i=2;i<1000005;i++)
  {
    if(!s[i])
    {
      T++;
      for(int j=i;j<1000005;j+=i)
      {
        s[j]=T;
      }
    }
  }

    while(scanf("%d",&a)!=EOF)
    {
        printf("%d\n",s[a]);
    }
  return 0;                                                   
}

也是看到其他大佬的答案(借鉴?)

我的理解:以i来找素数(因为2是第一个素数,所以最先找到),然后用j将其所有倍数找出,并标记其最大素因子位置,而因为后面的素数会比前面的晚查找到,所以会发生覆盖,即原来6的最大素因子标记为2的位置,因为3位于2的后面,所以覆盖了2的位置,使s[6]的值变成3的位置即值2。

最后将输入的数字直接带入数组,就是答案。(理解了感觉真是妙啊)

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

L.K.2

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值