欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2024-03-22 19:04:04
...

正整数分解循环做法(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,记录你的成长。希望通过这种方式给自己留下宝贵的记忆,让日后的我能在回首往昔时,对比现在的自己仍不忘初心。

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

相关标签: c语言