pascal数字拆分解释

来源:百度知道 编辑:UC知道 时间:2024/05/23 00:00:54
问题描述:120以内的数,拆分成n个自然数的和,求n的个数,要求用过程实现
我这儿的一种做法不是很明白,望高人指点,如果有其他方法,请不吝赐教
(n是自然数,c存放个数变量)
var n:byte;c:longint;
function min(x,y:integer):integer; {定义取两数种小些的数的函数}
begin
if x<y then min:=x else min:=y;
end;
procedure work(sy,kc:byte);
var i:byte;
begin
for i:=min(sy,kc) downto 1 do {此处甚难理解}
if i=sy then c:=c+1 else work(sy-i,i);
end;
begin
readln(n);
work(n,n);
writeln(c);
end.

work(sy,kc)表示将sy分成kc个数之和的情况总和
因为0也是自然数,所以
如n=4 work(4,4) 排序为递减关系有
work(0,4) 4 0 0 0
work(1,3) 3 1 0 0
work(2,2)--work(0,2) 2 2 0 0
work(2,2)--work(1,1) 2 1 1 0
work(3,1) 1 1 1 1
即将最左边的数i依次赋值为4 3 2 1
则剩余的数值sy-i应被分配在剩余的3个位置
此时work(sy,kc)中sy表示剩余数值
因为为递减排序
所以剩余排列中最大数最多赋值为原i
即 新kc=原i 递归即可
(其中我们定义work(0,x)=1 即为0 0 0...0 n个)