最大素因子


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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM