質因數的個數 (分解質因數)


鏈接:https://www.nowcoder.com/questionTerminal/20426b85f7fc4ba8b0844cc04807fbd9?f=discussion
來源:牛客網

[編程題]質因數的個數
  • 熱度指數:20444 時間限制:1秒 空間限制:65536K
求正整數N(N>1)的質因數的個數。 相同的質因數需要重復計算。如120=2*2*2*3*5,共有5個質因數。

輸入描述:
可能有多組測試數據,每組測試數據的輸入是一個正整數N,(1<N<10^9)。
輸出描述:
對於每組數據,輸出N的質因數的個數。
示例1

輸入

120

輸出

5

思路

1)題目需要多組測試用例,我的第一個想法是沒能每個測試用例都去判斷質數,所以可以使用打表法,把100000以內的質數標記出來

2)因為c++中的數組不能太大(同時也是考慮到題目有內存要求),標記的質數表不能全部包含所有可能的輸入數據的質因數,這里就有一個小技巧:如果輸入的數據n最后剩余不為1,則表示還存在一個大於質數表內的質數

 1 #include<iostream>
 2 #include<string>
 3 #include<cmath>
 4 #include<algorithm>
 5 
 6 using namespace std;
 7 
 8 bool mark[10000];
 9 int prime[10000];
10 int primeSize = 0;
11 
12 void init()
13 {
14     mark[1] = false;
15     for(int i = 2; i < 10000; ++i)
16         mark[i] = true;
17     for(int i = 2; i < 10000; ++i)
18     {
19         if(mark[i] == true)
20         {
21             prime[primeSize++] = i;
22             for(int j = i*i; j < 10000; j += i)
23                 mark[j] = false;    
24         }
25     }
26 }
27 
28 int main()
29 {
30     init();
31     int num;
32     while(cin >> num)
33     {
34         int ans = 0;
35         for(int i = 0; i < primeSize; ++i)
36         {
37             if(num == 1)
38                 break;
39             if(num % prime[i] == 0)
40             {
41                 num /= prime[i];
42                 ans++;
43                 i--;
44             }
45         }
46         if(num != 1)    // 若測試完2到10000內所有素因數, num仍未被分解至1, 則剩余的因數一定是一個大於10000的素因數
47             ans++;
48         cout << ans << endl;
49     }
50     
51     return 0;
52 }

 

思路升級

其實不需要再循環里判斷i是為為質數,如果i是合數,則一定不會被整除:那前面的質數一定已經合數中包含的質數被整除過了

 1 #include <iostream>
 2 #include <math.h>
 3 using namespace std;
 4 int main()
 5 {
 6     int n;
 7     while(cin>>n)
 8     {
 9         int i,count=0;
10         for(i=2; i<=sqrt(n); i++)
11         {
12             while(n%i==0)
13             {
14                 count++;
15                 n/=i;
16             }
17         }
18         if(n>1)
19             count++;
20         cout<<count<<endl;
21     }
22     return 0;
23 }

 


免責聲明!

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



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