# 正整数分解循环做法(c语言)

正整数分解循环做法(c语言)

题面:将一个正整数分解

例:输入:
4
输出:
4=3+1
4=2+2
4=2+1+1
4=1+1+1+1

困扰我一天的问题,看好多帖子都是递归或者动态二维数组之类的做法,我菜,没看懂,自己想了个循环的做法。

代码如下

#include <stdio.h>
#include <stdlib.h>

//输出函数
void shuchu(int wei,int *a,int x){
printf("%d=",x);
for(int i=0;i<wei;i++){
    if(i!=wei-1)
    printf("%d+",a[i]);
    else
        printf("%d\n",a[i]);
}
}

//算法子函数
void fenjie(int x){
int wei=2;//已分解成多少数
int a[20]={0};//支持20及以下数的分解,可改
a[0]=x-1;//将x分为x-1和1
a[1]=x-a[0];
shuchu(wei,a,x);
int k=wei-1;int sum=0;
    for(k=wei-1;k>=0;k--){
        //分解出来一个1,如2+2->2+1+1
        if((a[k]-a[k+1]==1&&a[k+1]!=0)||(a[k]>1&&k+1==wei)){
            a[k]=a[k]-1;
            a[wei]=1;
            wei++;
            shuchu(wei,a,x);
            k++;
        }
      //当前位减一分解,如3+1->2+2
      else {  if(a[k]!=1){
                sum=0;
                for(int i=0;i<k;i++)
                    sum=sum+a[i];//sum is x
                a[k]--;
                a[k+1]=x-sum-a[k];
                wei=k+2;
                for(int i=k+1;a[i]>a[i-1];i++){
                    a[i]=a[i-1];
                    a[i+1]=x-sum;
                    wei++;
                    for(int m=k;m<=i;m++)
                    a[i+1]=a[i+1]-a[m];
                }//for
                k=wei;
                shuchu(wei,a,x);
                }//if
    }//else
    }//for
}

//主函数
int main()
{
    int n;
    scanf("%d",&n);
    if(n==1)         //将不能分的省略
        printf("1=1\n");
        else{
    if(n==2)         //这里其实可以精简到子函数里,懒得改了
        printf("2=1+1\n");
    else
    fenjie(n);
    }//else
    return 0;
}

本人接触编程将近3个月,看到有趣的题想记录下来。正如首页的那句话:CSDN,记录你的成长。希望通过这种方式给自己留下宝贵的记忆,让日后的我能在回首往昔时,对比现在的自己仍不忘初心。

本人很菜,如有错误,恳请不吝赐教,谢谢。

  • 12
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值