改自:https://blog.csdn.net/summerxiachen/article/details/62421985
整数分解
在数学中,整数分解(英语:integer factorization)又称素因数分解(prime factorization),是将一个正整数写成几个约数的乘积。例如,给出45这个数,它可以分解成9×5。根据算术基本定理,这样的分解结果应该是独一无二的。这个问题在代数学、密码学、计算复杂性理论和量子计算机等领域中有重要意义。
因子分解
完整的因子列表可以根据约数分解推导出,将幂从零不断增加直到等于这个数。例如,因为45=32×5,45可以被30×50,30×51,31×50,31×51,32×50,和32×51,或者 1,5,3,9,15,和 45整除。相对应的,约数分解只包括约数因子。
加法分解
#include <iostream>
using namespace std;
#define MAX 20
int res_num;
// 拆分元素暂存在res数组中
int res[MAX];
int p = 0;
// 将n进行拆分
void resolve(int n, int min_factor=1);
int main() {
while (1) {
int n;
cin >> n;
resolve(n,1);
printf("共有%d种分解\n",res_num);
res_num = 0;
}
return 0;
}
void resolve(int n, int min_factor) {
if (n<=0) { // 出口
for (int i=0; i<p; i++)
cout << res[i] << " ";
cout << endl;
res_num++;
}
for (int i=min_factor; i<=n; i++) { // 此处修改
res[p] = i;
p++; // p ++来顺序存储各个拆分元素
resolve(n-i, i);// 此处修改
p--; // // 此行必须有,执行完这一行,下一次for循环才能回退
}
}
输入
6
输出
1 1 1 1 1 1
1 1 1 1 2
1 1 1 3
1 1 2 2
1 1 4
1 2 3
1 5
2 2 2
2 4
3 3
6
共有11种分解
乘法分解
#include<iostream>
using namespace std;
int data[100];
int p=0;
int num=0;
int x;
void resolve(int n,int min)
{
if(n<2)
{
num++;
cout<<x<<"=";
for(int j=0;j<p;j++)
{
cout<<data[j];
if(j!=p-1)
cout<<"*";
if(data[j]==x)
cout<<"*1";
}
cout<<endl;
return ;
}
for(int i=min;i<=n;i++)
{
if(n%i==0)
{
data[p]=i;
p++;
resolve(n/i,i);
p--;
}
}
}
int main()
{
while(cin>>x)
{
resolve(x,2);
printf("共有%d种分解\n",num);
}
}
输入
120
输出
120=2*2*2*3*5
120=2*2*2*15
120=2*2*3*10
120=2*2*5*6
120=2*2*30
120=2*3*4*5
120=2*3*20
120=2*4*15
120=2*5*12
120=2*6*10
120=2*60
120=3*4*10
120=3*5*8
120=3*40
120=4*5*6
120=4*30
120=5*24
120=6*20
120=8*15
120=10*12
120=120*1
共有21种分解