Zer0e's Blog

实现整数的所有划分数

字数统计: 440阅读时长: 1 min
2018/03/10 Share

本来以为已经弃C语言的坑了,没想到因为课程原因开始学习算法了= =!

还是不得不感叹时间飞逝,从开始只会写简单小程序到现在会使用简单算法的程序,想想半年前刚入协会的时候我连一个循环都写不出来….

说正事= =!

第一个算法案例就是递归问题:
利用递归来实现整数的划分数,并输出结果。
自己也想了很久,网上也找了几份源码,对自己现在写的不是很满意,之后再来完善吧。

代码部分

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
#include<stdio.h>

int a[100];
int t = 0;
int total = 0;
int count = 0;
void part(int x,int n)
{
int i,j;
for(i = x;i >= 1;i--) //把n从大到小分解
{
if(i + total <= n)
{
a[t++] = i; //将n的划分由大到小给数组a[]
total += i; //total的值逐渐向n靠拢,当n==total时就是打印的时候
part(i,n); //递归调用,直到满足n==total
}
}


if(total==n) //等式两边n=total时打印
{
if(a[0] != n)
printf("%d=",n); //如果右边不等于n,则打印等式左边的n及=
for(j=0;j<t;j++)
{
if(a[0] != n)
printf("%d",a[j]); //如果右边不等于n,则依次输出a[0],a[1],a[2].....
if(j < t - 1)
printf("+"); //如果a[j]不是最后一个加数,就打印+号
else
printf("\n"); //打印一行后添加'\n'
}
}
t--;
total-=a[t];
}


int main()
{
int n;
scanf("%d",&n);
part(n,n);
return 0;
}

运行结果

1
2
3
4
5
6
7
8
9
10
11
12
6

6=5+1
6=4+2
6=4+1+1
6=3+3
6=3+2+1
6=3+1+1+1
6=2+2+2
6=2+2+1+1
6=2+1+1+1+1
6=1+1+1+1+1+1
CATALOG
  1. 1. 代码部分
  2. 2. 运行结果