分解质因数算法 .

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分解质因数更快。 

posted @ 2013-08-16 08:57  永不止步,永无止境  阅读(2996)  评论(0)    收藏  举报