pascal划分正整数输入一个正整数,拆分成正整数的和,求所有的情况.注意是情况,不是情况的个数.如:输入5,输出5=1+1+1+1+15=1+1+1+25=1+1+35=1+2+25=1+45=2+35=5

来源:学生作业帮助网 编辑:作业帮 时间:2024/04/25 07:20:50
pascal划分正整数输入一个正整数,拆分成正整数的和,求所有的情况.注意是情况,不是情况的个数.如:输入5,输出5=1+1+1+1+15=1+1+1+25=1+1+35=1+2+25=1+45=2+35=5

pascal划分正整数输入一个正整数,拆分成正整数的和,求所有的情况.注意是情况,不是情况的个数.如:输入5,输出5=1+1+1+1+15=1+1+1+25=1+1+35=1+2+25=1+45=2+35=5
pascal划分正整数
输入一个正整数,拆分成正整数的和,求所有的情况.注意是情况,不是情况的个数.
如:输入5,输出
5=1+1+1+1+1
5=1+1+1+2
5=1+1+3
5=1+2+2
5=1+4
5=2+3
5=5

pascal划分正整数输入一个正整数,拆分成正整数的和,求所有的情况.注意是情况,不是情况的个数.如:输入5,输出5=1+1+1+1+15=1+1+1+25=1+1+35=1+2+25=1+45=2+35=5
你这里是不是有个规则,就是拆分后的数,是从小到大排列的?
函数如下:
function BreakNum(const AShowList: TStrings; const ANum: Integer): TStrings;
var
List: TStringList; //全局字符串列表,用于保存显示
//子函数,递归求解
procedure Break(const AStr: string; const ANum: Integer; Max: Integer);
var
i: Integer;
b1, b2: Integer;
begin
List.Add(Format('%s%d', [AStr, ANum]));
for i := 1 to ANum div 2 do
begin
b1 := i;
if b1 < Max then Continue;
if b1 > Max then Max := b1;
b2 := ANum - i;
if (b2 = Max) then
List.Add(Format('%s%d+%d', [AStr, b1, b2]))
else if (b2 > Max) then
Break(Format('%s%d+', [AStr, b1]), b2, Max);
end;
end;
begin
List := TStringList.Create;
try
List.Sorted := True; //进行排序,注释掉后则不排序
Break(Format('%d=', [ANum]), ANum, 0);
AShowList.Assign(List);
finally
List.Free;
end;
end;
调用时,可以在窗口上添加控件Memo1、TButton1、TEdit1.
双击Button1加入如下代码即可:
BreakNum(Memo1.Lines, StrToIntDef(Edit1.Text, 0));
10的运行结果如下:
10=1+1+1+1+1+1+1+1+1+1
10=1+1+1+1+1+1+1+1+2
10=1+1+1+1+1+1+1+3
10=1+1+1+1+1+1+2+2
10=1+1+1+1+1+1+4
10=1+1+1+1+1+2+3
10=1+1+1+1+1+5
10=1+1+1+1+2+2+2
10=1+1+1+1+2+4
10=1+1+1+1+3+3
10=1+1+1+1+6
10=1+1+1+2+2+3
10=1+1+1+2+5
10=1+1+1+3+4
10=1+1+1+7
10=1+1+2+2+2+2
10=1+1+2+2+4
10=1+1+2+3+3
10=1+1+2+6
10=1+1+3+5
10=1+1+4+4
10=1+1+8
10=1+2+2+2+3
10=1+2+2+5
10=1+2+3+4
10=1+2+7
10=1+3+3+3
10=1+3+6
10=1+4+5
10=1+9
10=10
10=2+2+2+2+2
10=2+2+2+4
10=2+2+3+3
10=2+2+6
10=2+3+5
10=2+4+4
10=2+8
10=3+3+4
10=3+7
10=4+6
10=5+5