正整数分解
程序整体思路
:
分解就是一个数减1,这个数后面的数加1
一次分解之后
找到最后一个比1大的元素坐标,然后与上一次相比,如果坐标发生了偏移,那么会发生向后偏移,说明又开始有一个数需要分解,这个时候需要增加一个元素,该情况下其实就是新出现了2;此时这个坐标是2所在的位置
将2分解完毕之后,再继续找比1大的元素坐标那么这个坐标应该向前偏移(2已经没有了,应该是2前面的数)。如果继续分解下去那么应该回到向后偏移之前的样子,所以此处需要复原函数,复原之后不找坐标了,而是直接将原m位置元素分解,然后继续重复之前的步骤。
此处输出部分值得注意,如果符合递增排序就可以输出(但同时还要控制,复原之后不能输出,并且还要注意复原之后不找坐标),如果不符合递增就继续分解。
代码如下
#include<stdio.h>
void print(int a[],int j,int n)
{
printf("%d=",n);
for(int m=0;m<j;m++)
{
printf("%d",a[m]);
if(m!=j-1)printf("+");
}printf("\n");
}
int zhao(int a[],int j)
{
int i;
for(i=j;i>-1;i--)
{
if(a[i]>1)
break;
}
return i;
}
int zeng(int a[],int n)
{
int flag=1;
for(int i=0;i<n;i++)
{
if(a[i]<a[i+1])
{flag=0;
break;}
}
return flag;
}
void huanyuan(int a[],int m,int j)
{
int sum=0,i;
for(i=m+1;i<j;i++)
{
sum=sum+a[i];
a[i]=0;
}
a[m+1]=sum;
}
int main(void)
{
int a[100]={0},n,m=0,u=0,j,flag=1;
scanf("%d",&n);
a[0]=n-1;a[1]=1;j=2;
print(a,j,n);
while(a[0]!=0)
{
if(flag!=0)
m=zhao(a,j);
if(m==u)
{
a[m]--;
a[m+1]++;
flag=1;
}
else if(m>u)
{
a[j++]++;
a[m]--;
u=m;
}
else if(m<u)
{
huanyuan(a,m,j);
flag=0;
j=m+2;
u=m;
}
if(zeng(a,j)&&flag!=0)
print(a,j,n);
}
return 0;
}
以上为个人观点,若有不当请指正