From c63d812a5c57b2e8b72125f4e5358bcd0767448d Mon Sep 17 00:00:00 2001 From: Mikhalkovich Stanislav Date: Tue, 21 Oct 2025 11:40:02 +0300 Subject: [PATCH] =?UTF-8?q?GCD=20LCM=20=D0=B2=20PABCSystem?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Configuration/GlobalAssemblyInfo.cs | 2 +- Configuration/Version.defs | 4 +- .../!Tutorial/07_CharString/Char3.pas | 10 ++-- .../!Tutorial/07_CharString/CharTable.pas | 6 +- .../!Tutorial/07_CharString/String1.pas | 13 ++--- .../!Tutorial/07_CharString/String2.pas | 16 +++--- .../!Tutorial/07_CharString/String3.pas | 16 +++--- .../!Tutorial/07_CharString/String4.pas | 16 +++--- .../!Tutorial/07_CharString/String5.pas | 16 +++--- .../!Tutorial/07_CharString/String6.pas | 16 +++--- .../07_CharString/StringInteger1.pas | 13 ++--- .../Algorithms/Recursion/Queens2.pas | 34 +++++++++++ Release/pabcversion.txt | 2 +- ReleaseGenerators/PascalABCNET_version.nsh | 2 +- bin/Lib/PABCSystem.pas | 57 ++++++++++++++++++- 15 files changed, 150 insertions(+), 73 deletions(-) create mode 100644 InstallerSamples/Algorithms/Recursion/Queens2.pas diff --git a/Configuration/GlobalAssemblyInfo.cs b/Configuration/GlobalAssemblyInfo.cs index b676a2f76..11e5d9de5 100644 --- a/Configuration/GlobalAssemblyInfo.cs +++ b/Configuration/GlobalAssemblyInfo.cs @@ -15,7 +15,7 @@ internal static class RevisionClass public const string Major = "3"; public const string Minor = "11"; public const string Build = "0"; - public const string Revision = "3672"; + public const string Revision = "3673"; public const string MainVersion = Major + "." + Minor; public const string FullVersion = Major + "." + Minor + "." + Build + "." + Revision; diff --git a/Configuration/Version.defs b/Configuration/Version.defs index 5f09bd398..032c2b919 100644 --- a/Configuration/Version.defs +++ b/Configuration/Version.defs @@ -1,4 +1,4 @@ -%COREVERSION%=0 -%REVISION%=3672 %MINOR%=11 +%REVISION%=3673 +%COREVERSION%=0 %MAJOR%=3 diff --git a/InstallerSamples/!Tutorial/07_CharString/Char3.pas b/InstallerSamples/!Tutorial/07_CharString/Char3.pas index 25dd82795..73e05380b 100644 --- a/InstallerSamples/!Tutorial/07_CharString/Char3.pas +++ b/InstallerSamples/!Tutorial/07_CharString/Char3.pas @@ -1,9 +1,7 @@ -// Стандартные функции UpperCase LowerCase -var c: char; - +// Стандартные функции UpperCase и LowerCase begin - c := 'д'; - writelnFormat('Символ {0} в верхнем регистре: {1}',c,UpperCase(c)); + var c := 'д'; + Println($'Символ {c} в верхнем регистре: {UpperCase(c)}'); c := 'F'; - writelnFormat('Символ {0} в нижнем регистре: {1}',c,LowerCase(c)); + Println($'Символ {c} в нижнем регистре: {LowerCase(c)}'); end. \ No newline at end of file diff --git a/InstallerSamples/!Tutorial/07_CharString/CharTable.pas b/InstallerSamples/!Tutorial/07_CharString/CharTable.pas index 220cb62fa..c3a4f8e17 100644 --- a/InstallerSamples/!Tutorial/07_CharString/CharTable.pas +++ b/InstallerSamples/!Tutorial/07_CharString/CharTable.pas @@ -1,8 +1,8 @@ -// Таблица символов и их кодов +// Таблица символов и их кодов begin for var i:=32 to 255 do begin - write(i:4,chr(i):2,' '); - if i mod 8 = 7 then writeln; + Write(i:4,chr(i):2,' '); + if i mod 8 = 7 then Writeln; end; end. diff --git a/InstallerSamples/!Tutorial/07_CharString/String1.pas b/InstallerSamples/!Tutorial/07_CharString/String1.pas index d6785340d..90f174ab3 100644 --- a/InstallerSamples/!Tutorial/07_CharString/String1.pas +++ b/InstallerSamples/!Tutorial/07_CharString/String1.pas @@ -1,12 +1,11 @@ -// Строки. Операция + и оператор +=. Доступ по индексу - -var s: string := 'Pascal'; +// Строки. Операция + и оператор +=. Доступ по индексу begin - writeln(s); + var s := 'Pascal'; + Println(s); s := s + '.'; - writeln(s); + Println(s); s += 'NET'; - writeln(s); - writeln(s[1],' ',s[2],' ',s[3],' ',s[4],' ',s[5],' ',s[6]); + Println(s); + Println(s[1], s[2], s[3], s[4], s[5], s[6]); end. \ No newline at end of file diff --git a/InstallerSamples/!Tutorial/07_CharString/String2.pas b/InstallerSamples/!Tutorial/07_CharString/String2.pas index a2a26c791..b566e4823 100644 --- a/InstallerSamples/!Tutorial/07_CharString/String2.pas +++ b/InstallerSamples/!Tutorial/07_CharString/String2.pas @@ -1,14 +1,14 @@ -// Строки. Процедура SetLength, функция Length и свойство Length - -var s: string; +// Строки. Процедура SetLength, функция Length и свойство Length begin - writeln('Length(s) = ',Length(s)); - SetLength(s,3); + var s := ''; + Println('Length(s) =', s.Length); + SetLength(s, 3); s[1] := 'N'; s[2] := 'E'; s[3] := 'T'; - writeln(s,' Length(s) = ',Length(s)); - for var i:= 1 to s.Length do - write(s[i],' '); + Println(s, ' Length(s) =', s.Length); + for var i := 1 to s.Length do + Print(s[i]); + Println; end. \ No newline at end of file diff --git a/InstallerSamples/!Tutorial/07_CharString/String3.pas b/InstallerSamples/!Tutorial/07_CharString/String3.pas index 5a2a97b3e..151ed4adb 100644 --- a/InstallerSamples/!Tutorial/07_CharString/String3.pas +++ b/InstallerSamples/!Tutorial/07_CharString/String3.pas @@ -1,12 +1,10 @@ -// Строки. Строка может иметь произвольную длину -var s: string; - +// Строки. Строка может иметь произвольную длину begin - s := 'abcdefghijklmnopqrstuvwxyz'; - s := s + Uppercase(s); - s += s; - s += s; + var s := 'abcdefghijklmnopqrstuvwxyz'; + s := s + UpperCase(s); s += s; - writeln('Длина строки = ',s.Length); - writeln('Cтрока: ',s); + s += s; + s += s; + Println('Длина строки =', s.Length); + Println('Строка:', s); end. \ No newline at end of file diff --git a/InstallerSamples/!Tutorial/07_CharString/String4.pas b/InstallerSamples/!Tutorial/07_CharString/String4.pas index 7c765fc61..c002b0e2f 100644 --- a/InstallerSamples/!Tutorial/07_CharString/String4.pas +++ b/InstallerSamples/!Tutorial/07_CharString/String4.pas @@ -1,12 +1,10 @@ -// Строки фиксированной длины. Длина не может быть больше 255 -var - s: string[9]; - s1: shortstring; // shortstring = string[255] - slong: string; - +// Строки фиксированной длины (устарели). Длина не может быть больше 255 + begin - slong := 'PascalABC.NET'; - writeln('Cтрока произвольной длины: ',slong); + var s: string[9]; + var s1: shortstring; // shortstring = string[255] + var slong := 'PascalABC.NET'; + Println('Строка произвольной длины:', slong); s := slong; - writeln('Cтрока фиксированной длины обрезается: ',s); + Println('Строка фиксированной длины обрезается:', s); end. \ No newline at end of file diff --git a/InstallerSamples/!Tutorial/07_CharString/String5.pas b/InstallerSamples/!Tutorial/07_CharString/String5.pas index e4e667578..656769157 100644 --- a/InstallerSamples/!Tutorial/07_CharString/String5.pas +++ b/InstallerSamples/!Tutorial/07_CharString/String5.pas @@ -1,18 +1,18 @@ -// Строки. Стандартные подпрограммы работы со строками +// Строки. Стандартные подпрограммы работы со строками (Copy устарела - используйте срезы) var s: string := ' Pascal__NET '; s1: string := 'NET'; begin - writeln('Исходная строка: ''',s,''''); + Writeln('Исходная строка: ''',s,''''); s := Trim(s); - writeln('После вызова функции Trim: ''',s,''''); + Writeln('После вызова функции Trim: ''',s,''''); var p := Pos(s1,s); - writelnFormat('Позиция подстроки ''{0}'' в строке ''{1}'' равна {2}',s1,s,p); + WritelnFormat('Позиция подстроки ''{0}'' в строке ''{1}'' равна {2}',s1,s,p); Delete(s,7,2); - writeln('После удаления символов __: ',s); + Writeln('После удаления символов __: ',s); Insert('ABC.',s,7); - writeln('После вставки подстроки ''ABC.'': ',s); - writeln('Первая часть строки: ',Copy(s,1,9)); - writeln('Последняя часть строки: ',Copy(s,11,3)); + Writeln('После вставки подстроки ''ABC.'': ',s); + Writeln('Первая часть строки: ',Copy(s,1,9)); + Writeln('Последняя часть строки: ',Copy(s,11,3)); end. \ No newline at end of file diff --git a/InstallerSamples/!Tutorial/07_CharString/String6.pas b/InstallerSamples/!Tutorial/07_CharString/String6.pas index 609eb8234..8c9ec80ac 100644 --- a/InstallerSamples/!Tutorial/07_CharString/String6.pas +++ b/InstallerSamples/!Tutorial/07_CharString/String6.pas @@ -1,18 +1,18 @@ -// Строки. Методы класса string +// Строки. Методы класса string var s: string := ' Pascal__NET '; s1: string := 'NET'; begin - writeln('Исходная строка: ''',s,''''); + Writeln('Исходная строка: ''',s,''''); s := s.Trim; - writeln('После вызова s.Trim: ''',s,''''); + Writeln('После вызова s.Trim: ''',s,''''); var p := s.IndexOf(s1); // Индексация - с нуля - writelnFormat('Позиция подстроки ''{0}'' в строке ''{1}'' равна {2}',s1,s,p); + WritelnFormat('Позиция подстроки ''{0}'' в строке ''{1}'' равна {2}',s1,s,p); s := s.Remove(6,2); - writeln('После удаления символов __: ',s); + Writeln('После удаления символов __: ',s); s := s.Insert(6,'ABC.'); - writeln('После вставки подстроки ''ABC.'': ',s); - writeln('Первая часть строки: ',s.Substring(0,9)); - writeln('Последняя часть строки: ',s.Substring(10,3)); + Writeln('После вставки подстроки ''ABC.'': ',s); + Writeln('Первая часть строки: ',s.Substring(0,9)); + Writeln('Последняя часть строки: ',s.Substring(10,3)); end. \ No newline at end of file diff --git a/InstallerSamples/!Tutorial/07_CharString/StringInteger1.pas b/InstallerSamples/!Tutorial/07_CharString/StringInteger1.pas index 484f91218..5c9dcd1d0 100644 --- a/InstallerSamples/!Tutorial/07_CharString/StringInteger1.pas +++ b/InstallerSamples/!Tutorial/07_CharString/StringInteger1.pas @@ -1,16 +1,13 @@ -// Преобразование целое <-> строка -var - s: string; - i: integer; +// Преобразование целое <-> строка begin // Преобразование целого в строку - i := 234; - s := IntToStr(i); - writelnFormat('Целое: {0}. После преобразования к строке: ''{1}''',i,s); + var i := 234; + var s := IntToStr(i); + WritelnFormat('Целое: {0}. После преобразования к строке: ''{1}''',i,s); // Преобразование строки в целое (может произойти исключение) s := '567'; i := StrToInt(s); - writelnFormat('Строка: ''{0}''. После преобразования к целому: {1}',s,i); + WritelnFormat('Строка: ''{0}''. После преобразования к целому: {1}',s,i); end. \ No newline at end of file diff --git a/InstallerSamples/Algorithms/Recursion/Queens2.pas b/InstallerSamples/Algorithms/Recursion/Queens2.pas new file mode 100644 index 000000000..929f1c08c --- /dev/null +++ b/InstallerSamples/Algorithms/Recursion/Queens2.pas @@ -0,0 +1,34 @@ +// Все решения задачи о расстановке ферзей на шахматной доске +const N = 8; + +var board := new integer[N]; // board[row] = столбец ферзя в этой строке + +procedure Place(row: integer); +begin + for var col := 0 to N-1 do + begin + // проверяем конфликты со всеми ранее поставленными ферзями + var conflict := False; + for var prevRow := 0 to row-1 do + if (board[prevRow] = col) or // тот же столбец + (Abs(board[prevRow] - col) = Abs(prevRow - row)) then // та же диагональ + begin + conflict := True; + break; + end; + + if not conflict then + begin + board[row] := col; // ставим ферзя + + if row = N-1 then + board.Println // выводим решение + else Place(row+1); // продолжаем рекурсию + end + end; +end; + +begin + Println('Все решения задачи о 8 ферзях:'); + Place(0); +end. \ No newline at end of file diff --git a/Release/pabcversion.txt b/Release/pabcversion.txt index 509ecdfab..8c009b583 100644 --- a/Release/pabcversion.txt +++ b/Release/pabcversion.txt @@ -1 +1 @@ -3.11.0.3672 +3.11.0.3673 diff --git a/ReleaseGenerators/PascalABCNET_version.nsh b/ReleaseGenerators/PascalABCNET_version.nsh index 720c08d5d..3b8a5800e 100644 --- a/ReleaseGenerators/PascalABCNET_version.nsh +++ b/ReleaseGenerators/PascalABCNET_version.nsh @@ -1 +1 @@ -!define VERSION '3.11.0.3672' +!define VERSION '3.11.0.3673' diff --git a/bin/Lib/PABCSystem.pas b/bin/Lib/PABCSystem.pas index 95872fa60..daf2d676e 100644 --- a/bin/Lib/PABCSystem.pas +++ b/bin/Lib/PABCSystem.pas @@ -1902,6 +1902,17 @@ function Lerp(a, b, t: real): real; /// Преобразует x из диапазона [a1,b1] в диапазон [a2,b2] с сохранением относительной позиции function Remap(x, a1, b1, a2, b2: real): real; +/// Возвращает наибольший общий делитель двух целых чисел +function GCD(a, b: integer): integer; +/// Возвращает наибольший общий делитель двух целых чисел +function GCD(a, b: int64): int64; +/// Возвращает наибольший общий делитель двух BigInteger +function GCD(a, b: BigInteger): BigInteger; +/// Возвращает наименьшее общее кратное двух целых чисел +function LCM(a, b: int64): int64; +/// Возвращает наименьшее общее кратное двух BigInteger +function LCM(a, b: BigInteger): BigInteger; + /// Инициализирует датчик псевдослучайных чисел procedure Randomize; /// Инициализирует датчик псевдослучайных чисел, используя значение seed. При одном и том же seed генерируются одинаковые псевдослучайные последовательности @@ -9525,6 +9536,48 @@ function Lerp(a, b, t: real): real := a + (b - a) * t; function Remap(x, a1, b1, a2, b2: real): real := a2 + (x - a1) * (b2 - a2) / (b1 - a1); +/// Возвращает наибольший общий делитель двух целых чисел +function GCD(a, b: integer): integer; +begin + var (x, y) := (Abs(a), Abs(b)); + while y <> 0 do + (x, y) := (y, x mod y); + Result := x; +end; + +/// Возвращает наибольший общий делитель двух больших целых чисел +function GCD(a, b: int64): int64; +begin + var (x, y) := (Abs(a), Abs(b)); + while y <> 0 do + (x, y) := (y, x mod y); + Result := x; +end; + +/// Возвращает наибольший общий делитель двух BigInteger +function GCD(a, b: BigInteger): BigInteger; +begin + var (x, y) := (Abs(a), Abs(b)); + while y <> 0 do + (x, y) := (y, x mod y); + Result := x; +end; + +/// Возвращает наименьшее общее кратное двух больших целых чисел +function LCM(a, b: int64): int64; +begin + if (a = 0) or (b = 0) then + Result := 0 + else Result := Abs(a div GCD(a, b)) * Abs(b); +end; + +/// Возвращает наименьшее общее кратное двух BigInteger +function LCM(a, b: BigInteger): BigInteger; +begin + if (a = 0) or (b = 0) then + Result := 0 + else Result := Abs(a div GCD(a, b)) * Abs(b); +end; procedure Randomize; begin @@ -13878,7 +13931,7 @@ begin Result := True; end; -/// Возвращает все перестановки множества элементов, заданного массивом +/// Возвращает все перестановки элементов массива function Permutations(Self: array of T): sequence of array of T; extensionmethod; begin var a := Self; @@ -13892,7 +13945,7 @@ begin until not NextPermutation(ind); end; -/// Возвращает все перестановки множества элементов, заданного последовательностью +/// Возвращает все перестановки элементов последовательности function Permutations(Self: sequence of T): sequence of array of T; extensionmethod; begin Result := Self.ToArray.Permutations