Skip to content

Instantly share code, notes, and snippets.

@leeonix
Last active August 29, 2015 14:05
Show Gist options
  • Save leeonix/1aa884ba28e18428af16 to your computer and use it in GitHub Desktop.
Save leeonix/1aa884ba28e18428af16 to your computer and use it in GitHub Desktop.
计算123456789,所有3位数加法的组合。
program three_num_add;
{$APPTYPE CONSOLE}
uses
Classes,
SysUtils;
type
PResult = ^TResult;
TResult = record
x, y, z: Integer;
end;
var
result_list: TList;
procedure gen_result();
var
simple_list: TList;
procedure gen_all_number();
var
a, b, c, num: Integer;
begin
for a := 1 to 9 do
for b := 1 to 9 do
for c := 1 to 9 do
if (a <> b) and (a <> c) and (b <> c) then
begin
num := a * 100 + b * 10 + c;
simple_list.Add(Pointer(num));
end;
end;
procedure calc_result(x, y, z: Integer);
type
TNumbers = set of 1 .. 9;
var
x_set, y_set, z_set: TNumbers;
res: PResult;
begin
if (z >= 987) or (simple_list.IndexOf(Pointer(z)) < 0) then
Exit;
x_set := [x div 100, (x mod 100) div 10, x mod 10];
y_set := [y div 100, (y mod 100) div 10, y mod 10];
z_set := [z div 100, (z mod 100) div 10, z mod 10];
if (x_set * y_set = []) and (x_set * z_set = []) and (z_set * y_set = []) then
begin
GetMem(res, SizeOf(TResult));
res^.x := x;
res^.y := y;
res^.z := z;
result_list.Add(res);
end;
end;
var
x, y: Integer;
I, J: Integer;
test_list: TList;
begin
simple_list := TList.Create;
gen_all_number();
test_list := TList.Create;
for I := 0 to simple_list.Count - 1 do
begin
test_list.Assign(simple_list);
test_list.Delete(I);
x := Integer(simple_list[I]);
for J := 0 to test_list.Count - 1 do
begin
y := Integer(test_list[J]);
calc_result(x, y, x + y);
end;
end;
test_list.Free;
simple_list.Free;
end;
procedure filter_result();
var
I, J: Integer;
temp_list1, temp_list2: TList;
x1, y1, x2, y2: Integer;
begin
temp_list1 := TList.Create;
temp_list1.Assign(result_list);
temp_list2 := TList.Create;
temp_list2.Assign(result_list);
for I := 0 to temp_list1.Count - 1 do
begin
for J := 0 to temp_list2.Count - 1 do
begin
if I = J then
Continue;
x1 := PResult(temp_list1[I])^.x;
y1 := PResult(temp_list1[I])^.y;
x2 := PResult(temp_list2[J])^.x;
y2 := PResult(temp_list2[J])^.y;
if (x1 = y2) and (x2 = y1) then
begin
PResult(result_list[J])^.x := 0;
end;
end;
end;
temp_list1.Free;
temp_list2.Free;
end;
procedure print_result();
var
I: Integer;
res: PResult;
begin
for I := 0 to result_list.Count - 1 do
begin
res := result_list[I];
if res^.x <> 0 then
Writeln(IntToStr(res^.x) + '+' + IntToStr(res^.y) + '=' + IntToStr(res^.z));
end;
end;
var
I: Integer;
begin
result_list := TList.Create;
gen_result();
filter_result();
print_result();
for I := 0 to result_list.Count - 1 do
FreeMem(result_list[I]);
result_list.Free;
end.
@davewang
Copy link

牛逼!!!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment