分治法——整数因子分解

大于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

结果:
在这里插入图片描述

  • 7
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值