分解質因數算法 .


2013-08-16 08:50:08

轉自:CSDN施工中請繞行

程序的原理,在這里解釋下

  將n分解質因數的一般方法::  i從2開始到sqrt(n)的每一個i由n試除,如果能整除就再判斷i是不是素數,如果是則i是n的一個質因子,然后n=n/i ,再將i歸位回2 再尋找n的質因子

   優化:: 大致思路不變,進行了一些剪枝,首先還是i從2開始到sqrt(n)的每一個i由n試除 ,如果i能整除n,那么不用判斷i,i必為n的質因子,將n=n/i  ,因為n可能有多個相同的質因子,為了避免遺漏,只需將i-- ,當跳到下一步循環的時候與i++抵消,i的值不變,由於由2~i的每一個數都已經判斷過是否能整除n,所以不必要再將i回退到2,只需另i在跳到下步循環的時候值不變即可,最后n也會被約成質數,也是一個質因子,所以寫成程序就是開頭的代碼,至於效率嗎 我認為還是比較高的。。

代碼:

 1 #include<stdio.h>
 2 #include<math.h>
 3 int main()  4 {  5     int n,i;  6     while(scanf("%d",&n)&&n)  7  {  8         for(i=2;i<=sqrt(n);i++)  9             if(n%i==0&&(n/=i)) 10                 printf("%d ",i--); 11         printf("%d/n",n); 12  } 13     return 0; 14 }

再優化:

做了很多重復的開平方運算,改改:

 1 #include<stdio.h>
 2 #include<math.h>
 3 int main()  4 {  5     int n,i,q;  6     while(scanf("%d",&n)&&n>1)  7  {  8         for(i=2,q=sqrt(n);i<=q;i++)  9             if(n%i==0&&(q=sqrt(n/=i))) 10                 printf("%d ",i--); 11         printf("%d",n); 12  } 13     return 0; 14 }

 

再優化:
可以先預處理下,得到一個連續的質數數組,然后用這些質數對n分解質因數更快。 


免責聲明!

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



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