Description
任何一个大于1的自然数总可以拆分成若干个自然数之和。
1:4=1+1+1+1
2:4=1+1+2
3:4=1+3
4:4=2+2
5:4=4
Input
输入仅一行,包含一个自然数n。
Output
这个自然数拆分结果。拆分出的因子要求满足s1+s2+…+sk=n 且s1≤s2≤…≤sk。具体要求见样例
Sample Input
4
Sample Output
1:4=1+1+1+1
2:4=1+1+2
3:4=1+3
4:4=2+2
5:4=4
解题思路:先读入n,然后进行搜索,结束条件为当所填的数已经等于n时输出并退出,从1到可以填到的数循环,如果数组的前一个数小于等于循环变量,就把数组当前对应的位置赋值为循环变量,然后继续搜索。
程序:
var
a:array[0..100]of longint;
n,t,total:longint;
procedure print(t:longint);
var
i:longint;
begin
inc(total);
write(total,':',n,'=');
for i:=1 to t-1 do
write(a[i],'+');
writeln(a[t]);
end;
procedure search(s,t:longint);
var
i:longint;
begin
if s=0 then begin print(t-1); exit; end;
for i:=1 to s do
if a[t-1]<=i then
begin
a[t]:=i;
s:=s-i;
search(s,t+1);
s:=s+a[t];
end;
end;
begin
readln(n);
search(n,1);
end.