最大素因子
题解报告: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 }