質因數分解(給定一個整數,求該數的所有質因數)


  題目:質因數分解,給定一個整數,求該數的所有質因數,例如 90 = 2*3**3*5。

  首先,質數的定義(引用百度百科):

   質數又稱素數,有無限個。一個大於1的自然數,如果除了1和它自身外,不能被其他自然數整除(除0以外)的數稱之為素數(質數);否則稱為合數。根據算術基本定理,每一個比1大的整數,要么本身是一個質數,要么可以寫成一系列質數的乘積;而且如果不考慮這些質數在乘積中的順序,那么寫出來的形式是唯一的。
  在自然數域內,質數是不可再分的數,是組成一切自然數的基本元素。 比如,10 是由兩個 2 和兩個 3 組成的,正如水分子是由兩個 H 原子和一個 O 原子組成的一樣。只是和化學世界不同,質數有無窮多個,因此算術世界的元素也就有無窮多個。算術世界內的一切對象、定理和方法,都是由其基本元素質數組成的。
  所以,注意,最小的質數(素數是2),1既不是質數也不是合數。回到題目,求一個整數的所有質因數,我們舉幾個例子來分析問題。比如,數字9 = 3*3,再比如18 = 2*9 = 2*3*3。所以,求解的過程就是從 i等於整數2開始搜索,看是否能整除n,如果n能夠被一個素數整除,那么判斷n/i的商是不是素數,如果不是素數,那么繼續求商的所有質因數;如果商也是素數,那么所有的質因數都被找出來了,停止遞歸。
  下面貼代碼,首先是判斷一個數是不是素數的函數:
 1 bool isZS(int n)
 2 {
 3     int sqrtN = (double)sqrt((double)n);
 4     if ( n==1 ) return true;
 5     if ( n==2 ) return true;
 6     if (sqrtN*sqrtN == n) return false;
 7     for (int i=2;i<=sqrtN;i++)
 8     {
 9         if ((n%i) == 0 )
10             return false;
11     }
12 
13     return true;
14 }

  然后是遞歸求解所有的質因數:

 1 void findAllZYS(int n)
 2 {
 3     if (n == 1) 
 4     {
 5         cout<<1;
 6         return ;
 7     }
 8     if (n == 2) 
 9     {
10         cout<<2;
11         return;
12     }
13     if (isZS(n))
14     {
15         cout<<" "<<n<<endl;
16         return;
17     }
18     int i = 2;
19     for (i=2;i<=n;i++)
20     {
21         if (isZS(i) && n%i == 0)
22         {
23             cout<<i<<" "<<endl;
24             break;
25         }
26     }
27 
28     int nxtN = n / i;
29     if (isZS(nxtN))
30     {
31         cout<<nxtN<<" "<<endl;
32         return;
33     }
34     else
35     {
36         findAllZYS(nxtN);
37     }
38 
39 }

   以上代碼有一些存在修改的地方,for (i=2;i<=n;i++),這個循環效率很低,遍歷從2到n,二樓提出建議很對,一個數如果不能被2~sqrt(n)整除肯定也就不能被sqrt(n)到n-1的數整除,所以這里可以修改,結合一樓的代碼,用迭代的方法實現,如下:

 1 vector<int> findAllZYS_Itr(int n)
 2 {
 3     vector<int> zys;
 4     if (isZS(n))
 5     {
 6         zys.push_back(n);
 7         return zys;
 8     }
 9 
10     for (int i=2;i<n;i++)
11     {
12         if ( n%i == 0 )
13         {
14             while (n%i == 0)
15             {
16                 n /= i;    
17                 zys.push_back(i);
18             }
19             if (isZS(n))
20             {
21                 zys.push_back(n);
22                 break;
23             }
24         }
25     }
26 
27     return zys;
28 }

 

 好了,上面就是我的思路和代碼了,拋磚引玉~歡迎指點~~


免責聲明!

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



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