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