# 正整数分解循环做法(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,记录你的成长。希望通过这种方式给自己留下宝贵的记忆,让日后的我能在回首往昔时,对比现在的自己仍不忘初心。
本人很菜,如有错误,恳请不吝赐教,谢谢。
上一篇: 网络编程--tcp客户端和tcp服务器端