整数因式分解
1问题的描述:
大于1的正整数n可以分解为:n=x1*x2*x3*…*xm.
例如,当n=12时,共有八种不同的分解式:
12=12
12=62
12=4
12=34
12=322
12=26
12=232
12=223
对于给定的正整数n,编程计算n共有多少种不同的分解式,并输出分解的结果。
2问题的分析:
对n的每个因子递归搜索,当n=12时,从2到12的整数约数有2,3,4,6,12.
即 n%i=0,然后进行n/i操作,按照这样的方式依次进行,最后得到1的停止操作,计算1的个数就是不同分解式的个数。
3递归的形式:
4代码的编写:
#include <iostream>
using namespace std;
int m=0;//m为记录分解的种数,初始化为0
void solve(int n,int a[],int L)
{
if (n==1)
{
m++;
}
else
{
for (int i=n;i>=2;i--)
{
if (n%i==0)
{
a[L]=i;
solve(n/i,a,L+1);
}
}
}
}
int main(int argc, char** argv) {
int n;
cout<<"请输入一个整数:"<<endl;
cin>>n;
int a[500]={0};
int L=0;
cout<<endl;
solve(n,a,L);
cout<<endl<<"总共有的分类种数:"<<m<<endl;
}
5 程序的运行
程序的运行结果给出了整数的因式分解的种数,但没有输出分解的形式。
6 代码的改进及运行的结果
#include <iostream>
using namespace std;
int m=0;//m为记录分解的种数,初始化为0
void prints(int a[],int n)
{
for (int i=0;i<n;i++)
{
cout<<a[i];
if (i!=n-1)
cout<<"×";
}
cout<<endl;
}
void solve(int n,int a[],int L)
{
if (n==1)
{
prints(a,L);
m++;
}
else
{
for (int i=n;i>=2;i--)
{
if (n%i==0)
{
a[L]=i;
solve(n/i,a,L+1);
}
}
}
}
int main(int argc, char** argv) {
int n;
cout<<"请输入一个整数:"<<endl;
cin>>n;
int a[500]={0};
int L=0;
cout<<endl;
cout<<"因式分解的结果输出"<<endl;
solve(n,a,L);
cout<<endl<<"总共有的分类种数:"<<m<<endl;
}
程序的运行结果
结果分析:输入一个整数n,就可以得到因式分解的结果以及分解的种数,如上图所示,完成了实验的任务。
7实验总结
先根据问题找出递推规律,结合教材上的算法和提示,编写出了因式分解的种数,主要就是输出分解的结果。于是编写两个函数,通过函数调用实现实验的目的。本次实验的时间复杂度为.当输入的数很大时(假设给出的内存空间足够),运行的时间增长的越来越大。

浙公网安备 33010602011771号