您的位置:首页 > 编程语言 > C语言/C++

编程珠玑第六章习题二——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。



#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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐