Para descomponer un entero positivo N en varios números enteros positivos y sumarlos, puede haber varios métodos de descomposición, como 7 = 6 + 1, 7 = 5 + 2, 7 = 5 + 1 + 1, .... Programa para encontrar todas las fórmulas de factorización de enteros de entero positivo N.
Formato de entrada:
Cada entrada contiene un caso de prueba, que es un entero positivo N (0 <<< N≤ \ le≤30).
Formato de salida:
Genere todas las fórmulas de descomposición de números enteros de N en orden creciente. Orden creciente significa: Para dos secuencias de descomposición N1 = N_1 = N 1 = {n1, n2, ... n_1, n_2, \ cdotsn 1, n 2, ...} y N2 = N_2 = N 2 = {m1, m2, ... m_1, m_2, \ cdotsm 1, m 2, ...}, si iii existe de modo que n1 = m1, ..., ni = min_1 = m_1, \ cdots , n_i = m_in 1 = m 1, ..., n i = m i, pero ni + 1 <mi + 1n_ {i + 1} <m_ {i + 1} n I + 1 <m i + 1, la secuencia N1N_1N 1 debe salir antes que la secuencia N2N_2N 2. Agregue cada fórmula de pequeña a grande, separe las fórmulas con punto y coma y envuelva después de cada 4 fórmulas.
Muestra de entrada:
7
Salida de muestra:
7 = 1 + 1 + 1 + 1 + 1 + 1 + 1; 7 = 1 + 1 + 1 + 1 + 1 + 2; 7 = 1 + 1 + 1 + 1 + 3; 7 = 1 + 1 + 1 + 2 + 2
7 = 1 + 1 + 1 + 4; 7 = 1 + 1 + 2 + 3; 7 = 1 + 1 + 5; 7 = 1 + 2 + 2 + 2
7 = 1 + 2 + 4; 7 = 1 + 3 + 3; 7 = 1 + 6; 7 = 2 + 2 + 3
7 = 2 + 5; 7 = 3 + 4; 7 = 7
#include<cstdio>
int sum = 0,n,pointer=0,count = 0;//sum是和,n是待求的数,pointer 指示搜索位置 ,count用来计数,
int A[30];//存放搜索结果 //记录当前是第一个分解式子,便于输出
void dfs(int x)//一层dfs就是对一个位置的搜索,如第一层dfs就是对第一个位置的数字进行搜索
{ //所以进入下一层dfs进行搜索时,搜索数从x开始而不是从1开始
if(sum == n) //当sum == n时到了一个死胡同,返回上一层的dfs
{
count++;
printf("%d=",n);
for(int i=0; i<pointer-1; i++)
{
printf("%d+",A[i]);
}
if(count%4==0||A[pointer-1]==n)
{
printf("%d\n",A[pointer-1]);
}
else
{
printf("%d;",A[pointer-1]);
}
return;
}
else if(sum>n) return;//当sum > n时到了一个死胡同,返回上一层的dfs
else//没到死胡同,不撞南墙不回头
{
for(int i=x; i<=n; i++)//i从x开始是因为后面位置的数一定要大于前面的数
{
A[pointer] = i;//用i来探索
pointer++;
sum += i;
dfs(i);//下一个位置从i开始探索
//如果程序进行到这说明当前层探索值为i时,包括下一层以后的所有层数都已经探索完毕
//准备进入下一层循环
//进入下一次循环前,要把当前sum回溯,指针指回当前位置
sum -= i;
pointer--;
}
}
}
int main()
{
scanf("%d",&n);
dfs(1);
return 0;
}