首页 > 代码库 > 质因数分解(给定一个整数,求该数的所有质因数)
质因数分解(给定一个整数,求该数的所有质因数)
题目:质因数分解,给定一个整数,求该数的所有质因数,例如 90 = 2*3**3*5。
首先,质数的定义(引用百度百科):
质数又称素数,有无限个。一个大于1的自然数,如果除了1和它自身外,不能被其他自然数整除(除0以外)的数称之为素数(质数);否则称为合数。根据算术基本定理,每一个比1大的整数,要么本身是一个质数,要么可以写成一系列质数的乘积;而且如果不考虑这些质数在乘积中的顺序,那么写出来的形式是唯一的。
在自然数域内,质数是不可再分的数,是组成一切自然数的基本元素。 比如,10 是由两个 2 和两个 3 组成的,正如水分子是由两个 H 原子和一个 O 原子组成的一样。只是和化学世界不同,质数有无穷多个,因此算术世界的元素也就有无穷多个。算术世界内的一切对象、定理和方法,都是由其基本元素质数组成的。
所以,注意,最小的质数(素数是2),1既不是质数也不是合数。回到题目,求一个整数的所有质因数,我们举几个例子来分析问题。比如,数字9 = 3*3,再比如18 = 2*9 = 2*3*3。所以,求解的过程就是从i等于整数2开始搜索,看是否能整除n,如果n能够被一个素数整除,那么判断n/i的商是不是素数,如果不是素数,那么继续求商的所有质因数;如果商也是素数,那么所有的质因数都被找出来了,停止递归。
下面贴代码,首先是判断一个数是不是素数的函数:
1 bool isZS(int n) 2 { 3 int sqrtN = (double)sqrt((double)n); 4 if ( n==1 ) return true; 5 if ( n==2 ) return true; 6 if (sqrtN*sqrtN == n) return false; 7 for (int i=2;i<=sqrtN;i++) 8 { 9 if ((n%i) == 0 ) 10 return false; 11 } 12 13 return true; 14 }
然后是递归求解所有的质因数:
1 void findAllZYS(int n) 2 { 3 if (n == 1) 4 { 5 cout<<1; 6 return ; 7 } 8 if (n == 2) 9 { 10 cout<<2; 11 return; 12 } 13 if (isZS(n)) 14 { 15 cout<<" "<<n<<endl; 16 return; 17 } 18 int i = 2; 19 for (i=2;i<=n;i++) 20 { 21 if (isZS(i) && n%i == 0) 22 { 23 cout<<i<<" "<<endl; 24 break; 25 } 26 } 27 28 int nxtN = n / i; 29 if (isZS(nxtN)) 30 { 31 cout<<nxtN<<" "<<endl; 32 return; 33 } 34 else 35 { 36 findAllZYS(nxtN); 37 } 38 39 }
好了,上面就是我的思路和代码了,抛砖引玉~欢迎指点~~
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。