题解报告: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 }
来源:https://www.cnblogs.com/acgoto/p/9821994.html