題解報告: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 }