分解质因数算法 .


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