质因数分解(给定一个整数,求该数的所有质因数)

  题目:质因数分解,给定一个整数,求该数的所有质因数,例如 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 }

   以上代码有一些存在修改的地方,for (i=2;i<=n;i++),这个循环效率很低,遍历从2到n,二楼提出建议很对,一个数如果不能被2~sqrt(n)整除肯定也就不能被sqrt(n)到n-1的数整除,所以这里可以修改,结合一楼的代码,用迭代的方法实现,如下:

 1 vector<int> findAllZYS_Itr(int n)
 2 {
 3     vector<int> zys;
 4     if (isZS(n))
 5     {
 6         zys.push_back(n);
 7         return zys;
 8     }
 9 
10     for (int i=2;i<n;i++)
11     {
12         if ( n%i == 0 )
13         {
14             while (n%i == 0)
15             {
16                 n /= i;    
17                 zys.push_back(i);
18             }
19             if (isZS(n))
20             {
21                 zys.push_back(n);
22                 break;
23             }
24         }
25     }
26 
27     return zys;
28 }

 

 好了,上面就是我的思路和代码了,抛砖引玉~欢迎指点~~

转载于:https://www.cnblogs.com/alway6s/p/3746790.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值