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分解質因數更快。