大于1的正整数n可以分解为:n=x1×x2×…×xm。例如,当n=18时,共有8种不同的分解式。
对于给定的正整数n,计算n共有多少种不同的分解式。
方法:将一个数n从2到它本身依次求余,如果发现n求余i后为0,说明i是这个整数的因子,那么我们对n/i再进行递归求因子,直到n/i变为1停止递归。
//*/
#include <bits/stdc++.h>
using namespace std;
int cnt = 0 ;
stack<int> s;
void write(){
int e;
stack<int> s1;
//输出栈s,即n的因子,同时用栈s1中转
while (!s.empty()){
e=s.top();
s1.push(e);
cout<<e<<" ";
s.pop();
}//while
cout<<endl;
//以s1为中转,s因子恢复原状
while (!s1.empty()){
e=s1.top();
s.push(e);
s1.pop();
}//while
}//write
void factorization(int n){
if(n ==1){ //分解到1,获得1种方案,输出
cnt++ ;
write();
}//if
int i = 2 ;
while (i<=n){
if(n%i==0) { //整除,i是因子
s.push(i); //入栈
factorization(n/i) ; //对 n/i 进行因子分解
s.pop(); //还原,因子i归还
}//if
i++ ;
}//while
}//factorization
int main(){
int n ;
cin>>n;
cout<<endl;
factorization(n) ;
cout<<endl<<cnt;
return 0 ;
}//main
使用数组模拟栈:
//*/
#include <bits/stdc++.h> //万能头文件
using namespace std;
int cnt=0; //记录可分解方案数
int a[30],k=0; //模拟栈a,栈顶指针k
void write()
{
int i;
for(i=k-1;i>=0;i--)
cout<<a[i]<<" ";
cout<<endl;
}//write
void factorization(int n)
{
if(n==1) //分解到因子为1,获得一种方案
{
cnt++; //计数增加
write(); //输出
}
int i=2; //从因子2开始测试
while(i<=n) //因子不大于数本身
{
if(n%i==0) //能整除
{
a[k++]=i; //加入因子
factorization(n/i); //对 n/i 进行因子分解
k--; //归还因子
}
i++; //因子变大,再次测试
}
}//factorization
int main(){
int n ;
cin>>n;
cout<<endl;
factorization(n); //分解因子
cout<<endl<<"可分解方案数:"<<cnt;
return 0 ;
}//main
结果: