正整数分解

正整数分解

程序整体思路

分解就是一个数减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;
    }

以上为个人观点,若有不当请指正

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值