最大素因子

题解报告:NYOJ 520 最大素因子

描述

GreyAnts最近正在学习数论中的素数,但是现在他遇到了一个难题:给定一个整数n,要求我们求出n的最大素因子的序数,例如:2的序数是1,3的序数是2,5的序数是3,以此类推. 研究数论是需要很大的耐心的,为了惩罚那些没有耐心读完题目的童鞋,我们规定:1的最大素因子序数是0.

输入

有多组测试数据,每一行输入一个数字n.(0<n<=1000000)

输出

在接下来的一行,输出结果.

样例输入

2
3
4
5

样例输出

1
2
1
3

解题思路:任何一个不小于2的正整数都可表示成若干个素数乘积的形式,因此通过枚举素数的倍数,即可求出每个数的最大素因子在素数表中排第几,简单打个表,时间复杂度大概为O(nlogn),约等于1.38e07。

AC代码:

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 const int maxn=1e6+5;
 4 int n,pos[maxn];
 5 void init(){
 6     memset(pos,0,sizeof(pos));
 7     for(int i=2,cnt=0;i<maxn;++i){//从2开始
 8         if(!pos[i]){//如果i是素数
 9             cnt++;
10             for(int j=i;j<maxn;j+=i)//填充素数i的倍数的序号,素数的整倍数的最大素因子可能是该素数,更新素数对应的呈现的次序,如果不是,以后可更新
11                 pos[j]=cnt;
12         }
13     }
14 }
15 int main(){
16     init();
17     while(cin>>n){
18         cout<<pos[n]<<endl;
19     }
20     return 0;
21 }

找最大

Time Limit: 2000/1000ms (Java/Others)

Problem Description:

按顺序输出2到1e6之间每个数(包含2和1e6)的最大素因子(质因子),若为素数则输出本身。

Input:

本题没有输入。

Output:

每5个数输出一行,数与数之间用一个空格隔开,行末没有空格,最后一行不足5个数自成一行。

Sample Input:

无输入

Sample Output:

2 3 2 5 3
7 2 3 5 11
...........
1321 127 37 5
解题思路:此题思路和上面的一样,只需枚举素数的倍数即可。
AC代码:
 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 typedef long long LL;
 4 const int maxn=1000001;
 5 int prime[maxn];
 6 void get_max_prime_factor(){
 7     memset(prime,0,sizeof(prime));
 8     for(int i=2;i<maxn;++i){
 9         if(!prime[i]){//如果i是素数
10             for(int j=i;j<maxn;j+=i)
11                 prime[j]=i;//将i标记为j的可能最大素因子
12         }
13     }
14 }
15 int main(){
16     get_max_prime_factor();
17     for(int i=2;i<maxn;++i)
18         cout<<prime[i]<<(((i-1)%5==0||i==maxn-1)?'\n':' ');
19     return 0;
20 }

 

posted @ 2018-10-20 15:47  霜雪千年  阅读(1797)  评论(0编辑  收藏  举报