编程珠玑第六章习题二——C++实现一个数的因子分解
2014-11-05 17:03
267 查看
引申为一道题目:
将大于1的自然数N进行因式分解,满足N=a1*a2*a3…am
编一程序,对任意的自然数N,
求N的所有形式不同的因式分解方案总数。
如N=12,共有8种分解方案,它们分别是:
12=12
12=6*2
12=4*3
12=3*4
12=3*2*2
12=2*6
12=2*3*2
12=2*2*3
Input 输入文件仅有一行包含一个整数N。Output 输出文件仅有一行包含一个整数表示自然数N的因式分解方案总数。Sample Input 12 Sample Output 8 Hint 1 <= N <= 2,000,000,000
不考虑大数的情况下的做法:
利用递归方法求解:
这里用到了动态规划,记忆化搜索(DP的一种实现方式),这种方法只要加一个记录状态的数组就可以了,同时也可以进行递推(顺推实现DP)。另外根据这里输入N的范围,采用long整型数组,因为long是32位表示范围大于 2,000,000,000。
如果是仅仅要求求出因式分解的个数的话,可以按照下面的程序求解:
将大于1的自然数N进行因式分解,满足N=a1*a2*a3…am
编一程序,对任意的自然数N,
求N的所有形式不同的因式分解方案总数。
如N=12,共有8种分解方案,它们分别是:
12=12
12=6*2
12=4*3
12=3*4
12=3*2*2
12=2*6
12=2*3*2
12=2*2*3
Input 输入文件仅有一行包含一个整数N。Output 输出文件仅有一行包含一个整数表示自然数N的因式分解方案总数。Sample Input 12 Sample Output 8 Hint 1 <= N <= 2,000,000,000
不考虑大数的情况下的做法:
利用递归方法求解:
这里用到了动态规划,记忆化搜索(DP的一种实现方式),这种方法只要加一个记录状态的数组就可以了,同时也可以进行递推(顺推实现DP)。另外根据这里输入N的范围,采用long整型数组,因为long是32位表示范围大于 2,000,000,000。
#include<iostream> using namespace std; bool candecompose(int a) { for(int i=a-1;i>1;i--) { if(a%i==0) return true; } return false; } int decomposition(int a,int temp[],int num)//temp用来保存每一次分解出来的因子,更确切的是上一次的分解,用来应对继续分解,num用来统计分解出来的因子的个数 { static int count=1;//统计有多少种分解的方法,上面已经有一种了所以从1开始计算,使用了静态局部变量,这样每一次调用的时候可以保持上一次调用的count的值 for(int i=a-1;i>1;i--)//注意这里必须i=a-1开始不能从a开始,若是从i=a开始,那么会把3*4和3*4*1分为两种情况 { int originalnum=num;//必须定义这originalnum,因为新的因子分解而不是建立在对前面的分解出的因子再分解的基础上时,这时候就需要复原num的最初值 if(a%i==0) { count++; if(num!=0)//如果进入这个方法,说明因子待分解 { int original=a; for(int j=0;j<num;j++) original*=temp[j]; cout<<original<<"="; for(int k=0;k<num;k++) cout<<temp[k]<<'*';//输出上一次分解的时候的因子的表达式,而这里因为是if(a%i==0),所以肯定又分解出来了新的因子i } else { cout<<a<<"=";//表示之前没有分解出因子,这是一种新的因子分解而不是建立在对前面的分解出的因子再分解的基础上 } cout<<i<<'*'<<a/i<<endl;//把新产生的因子i输出,包括其对应的约数,这样得到的就是一个分解 temp[originalnum++]=i;//跟新temp数组,把新分解出来的因子放入temp数组中 if(candecompose(a/i))//如果还能够继续分解则继续分解 { decomposition(a/i,temp,originalnum); } } } return count; } int main() { int a=12; int temp[100]; cout<<a<<"="<<a<<"*1"<<endl;//必须要单独列出来,这个分解情况比较特殊 int result=decomposition(a,temp,0); cout<<"总共有"<<result<<"种因子分解式"<<endl; return 0; }
如果是仅仅要求求出因式分解的个数的话,可以按照下面的程序求解:
#include<iostream> using namespace std; int derive(int a) { static int count=1; for(int i=a-1;i>1;i--) { if(a%i==0) { count++; derive(a/i); } } return count; } int main() { int a=12; int result=derive(a); cout<<result<<endl; return 0; }
相关文章推荐
- 编程珠玑第五章习题五——C++实现二分搜索时进行错误检测
- 我写的编程珠玑第一章位图的实现,使用C++
- C++实现堆排序并记录编程中遇到的一个bug(不要对无符号整形数在--的循环中采用>=0作为结束条件)
- 整数因子分解:计算一个整数所有的分解式(递归实现)
- 一个无聊男人的疯狂《数据结构与算法分析-C++描述》学习笔记 用C++/lua/python/bash的四重实现(7)习题2.8 随机数组的三种生成算法
- 编程珠玑: 14章 堆 14.2实现一个优先级队列,返回数组中最小值 -------解题总结
- 一个无聊男人的疯狂《数据结构与算法分析-C++描述》学习笔记 习题2.8 随机数组的三种生成算法(补) 将bash的实现翻译成比较纯正的bash风格
- 编程珠玑第一章之产生数据1000000-9999999(二)C/C++高效实现
- C++ primer plus编程第六章练习习题代码
- 50道编程题之09:一个数如果刚好等于它的因子之和,这个数就称为"完数"。例如6 = 1+2+3,编程实现求[a,b]之间的所有完数
- 编程能力训练 —— 2nd C++习题:输入一个成绩判断并输出相应的等级
- 编程珠玑: 15.1实现一个哈希表统计字符串出现次数 -------解题总结
- 【编程珠玑】第十五章--字符串:统计文本中单词数量(C++的Map&C的结构体实现&POJ2418)
- 用栈来实现分解一个数成素因子乘积的形式。
- c++和c实现混合编程接口--extern “C”含义深层探索
- Delphi编程 -- 如何实现一个支持Visual Basic的For Each调用的COM对象
- 用C++的高级模版特性实现一个不需要IDL的RPC
- C++之一个编程入门者的感悟
- 如何编程实现删除一个sap的在线用户
- 如何编程实现删除一个sap的在线用户