Сделал возможным неявное приведение некоторого типа к array of T (при описании оператора в виде статической функции класса)
School - IsPrime(n)
This commit is contained in:
parent
3db5709101
commit
64acde6460
|
|
@ -15,7 +15,7 @@ internal static class RevisionClass
|
|||
public const string Major = "3";
|
||||
public const string Minor = "9";
|
||||
public const string Build = "0";
|
||||
public const string Revision = "3520";
|
||||
public const string Revision = "3521";
|
||||
|
||||
public const string MainVersion = Major + "." + Minor;
|
||||
public const string FullVersion = Major + "." + Minor + "." + Build + "." + Revision;
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
%COREVERSION%=0
|
||||
%REVISION%=3520
|
||||
%MINOR%=9
|
||||
%REVISION%=3521
|
||||
%COREVERSION%=0
|
||||
%MAJOR%=3
|
||||
|
|
|
|||
|
|
@ -8,4 +8,7 @@
|
|||
Cartesian(1..4,3..5,(x,y) -> x*y).Println;
|
||||
Cartesian(1..2,4..5,6..7).Println;
|
||||
Cartesian(1..2,4..5,6..7,(x,y,z) -> x*y*z).Println;
|
||||
|
||||
foreach var (a,b) in Cartesian(1..2,3..5) do
|
||||
Print($'{a}+{b}')
|
||||
end.
|
||||
|
|
@ -1 +1 @@
|
|||
3.9.0.3520
|
||||
3.9.0.3521
|
||||
|
|
|
|||
|
|
@ -1 +1 @@
|
|||
!define VERSION '3.9.0.3520'
|
||||
!define VERSION '3.9.0.3521'
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
/// Учебный модуль, реализующий базовые алгоритмы информатики (18.07.2024)
|
||||
/// Учебный модуль, реализующий базовые алгоритмы информатики (31.07.2024)
|
||||
unit School;
|
||||
|
||||
interface
|
||||
|
|
@ -203,6 +203,9 @@ function НОДНОК(a, b: int64): (int64, int64);
|
|||
/// Разложение числа на простые множители
|
||||
function Factorize(n: integer): List<integer>;
|
||||
|
||||
/// возвращает True, если число n простое и False в противном случае
|
||||
function IsPrime(n: integer): boolean;
|
||||
|
||||
/// Простые числа на интервале [2;n]
|
||||
function Primes(n: integer): List<integer>;
|
||||
|
||||
|
|
@ -705,6 +708,47 @@ Factorize(Self);
|
|||
|
||||
{$region Primes}
|
||||
|
||||
// Внутреняя процедура для заполнения LPrimes
|
||||
// Решето Эратосфена
|
||||
procedure PrimesInternal;
|
||||
begin
|
||||
LPrimes := new List<integer>;
|
||||
var Sieve := new boolean[ubPrimeDivs + 1];
|
||||
for var i := 2 to ubPrimeDivs do
|
||||
if not Sieve[i] then
|
||||
begin
|
||||
LPrimes.Add(i);
|
||||
var k := i;
|
||||
while k <= ubPrimeDivs - i do
|
||||
begin
|
||||
k += i;
|
||||
Sieve[k] := True
|
||||
end
|
||||
end
|
||||
end;
|
||||
|
||||
/// возвращает True, если число n простое и False в противном случае
|
||||
function IsPrime(n: integer): boolean;
|
||||
begin
|
||||
if n < 2 then
|
||||
Result := False
|
||||
else
|
||||
begin
|
||||
Result := True;
|
||||
foreach var prime in LPrimes do
|
||||
if Sqr(prime) > n then
|
||||
break
|
||||
else if n mod prime = 0 then
|
||||
begin
|
||||
Result := False;
|
||||
break
|
||||
end
|
||||
end
|
||||
end;
|
||||
|
||||
/// возвращает True, если число простое и False в противном случае
|
||||
function IsPrime(Self: integer): boolean; extensionmethod := IsPrime(Self);
|
||||
|
||||
/// Простые числа на интервале [2;n]
|
||||
function Primes(n: integer): List<integer>;
|
||||
// Решето Эратосфена
|
||||
|
|
@ -732,44 +776,6 @@ begin
|
|||
Result.Add(i)
|
||||
end;
|
||||
|
||||
// Внутреняя процедура для заполнения LPrimes
|
||||
// Решето Эратосфена
|
||||
procedure PrimesInternal;
|
||||
begin
|
||||
LPrimes := new List<integer>;
|
||||
var Sieve := new boolean[ubPrimeDivs + 1];
|
||||
for var i := 2 to ubPrimeDivs do
|
||||
if not Sieve[i] then
|
||||
begin
|
||||
LPrimes.Add(i);
|
||||
var k := i;
|
||||
while k <= ubPrimeDivs - i do
|
||||
begin
|
||||
k += i;
|
||||
Sieve[k] := True
|
||||
end
|
||||
end
|
||||
end;
|
||||
|
||||
/// возвращает True, если число простое и False в противном случае
|
||||
function IsPrime(Self: integer): boolean; extensionmethod;
|
||||
begin
|
||||
if Self < 2 then
|
||||
Result := False
|
||||
else
|
||||
begin
|
||||
Result := True;
|
||||
foreach var prime in LPrimes do
|
||||
if Sqr(prime) > Self then
|
||||
break
|
||||
else if Self mod prime = 0 then
|
||||
begin
|
||||
Result := False;
|
||||
break
|
||||
end
|
||||
end
|
||||
end;
|
||||
|
||||
/// Простые числа на интервале [m;n]
|
||||
function Primes(m, n: integer): List<integer>;
|
||||
begin
|
||||
|
|
|
|||
|
|
@ -2459,6 +2459,21 @@ namespace PascalABCCompiler.TreeRealization
|
|||
{
|
||||
fn = fn.get_instance(ctn.instance_params, true, null);
|
||||
}
|
||||
else if (ctn.type_special_kind == SemanticTree.type_special_kind.array_kind)
|
||||
// надо ещё проверить rank - а его просто проверить только у compiled_type_node - как у common_type_node - не знаю
|
||||
{
|
||||
var rank = 1;
|
||||
if (ctn is compiled_type_node comptn)
|
||||
rank = comptn.rank;
|
||||
else if (ctn is compiled_type_node commtn)
|
||||
rank = commtn.rank;
|
||||
if (rank == 1)
|
||||
{
|
||||
List<type_node> instance_params = new List<type_node>();
|
||||
instance_params.Add(ctn.element_type);
|
||||
fn = fn.get_instance(instance_params, false, null);
|
||||
}
|
||||
}
|
||||
else if (fn.get_generic_params_list() != null && fn.get_generic_params_list().Count > 0)
|
||||
{
|
||||
if (ctn.IsPointer)
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
/// Учебный модуль, реализующий базовые алгоритмы информатики (18.07.2024)
|
||||
/// Учебный модуль, реализующий базовые алгоритмы информатики (31.07.2024)
|
||||
unit School;
|
||||
|
||||
interface
|
||||
|
|
@ -203,6 +203,9 @@ function НОДНОК(a, b: int64): (int64, int64);
|
|||
/// Разложение числа на простые множители
|
||||
function Factorize(n: integer): List<integer>;
|
||||
|
||||
/// возвращает True, если число n простое и False в противном случае
|
||||
function IsPrime(n: integer): boolean;
|
||||
|
||||
/// Простые числа на интервале [2;n]
|
||||
function Primes(n: integer): List<integer>;
|
||||
|
||||
|
|
@ -705,6 +708,47 @@ Factorize(Self);
|
|||
|
||||
{$region Primes}
|
||||
|
||||
// Внутреняя процедура для заполнения LPrimes
|
||||
// Решето Эратосфена
|
||||
procedure PrimesInternal;
|
||||
begin
|
||||
LPrimes := new List<integer>;
|
||||
var Sieve := new boolean[ubPrimeDivs + 1];
|
||||
for var i := 2 to ubPrimeDivs do
|
||||
if not Sieve[i] then
|
||||
begin
|
||||
LPrimes.Add(i);
|
||||
var k := i;
|
||||
while k <= ubPrimeDivs - i do
|
||||
begin
|
||||
k += i;
|
||||
Sieve[k] := True
|
||||
end
|
||||
end
|
||||
end;
|
||||
|
||||
/// возвращает True, если число n простое и False в противном случае
|
||||
function IsPrime(n: integer): boolean;
|
||||
begin
|
||||
if n < 2 then
|
||||
Result := False
|
||||
else
|
||||
begin
|
||||
Result := True;
|
||||
foreach var prime in LPrimes do
|
||||
if Sqr(prime) > n then
|
||||
break
|
||||
else if n mod prime = 0 then
|
||||
begin
|
||||
Result := False;
|
||||
break
|
||||
end
|
||||
end
|
||||
end;
|
||||
|
||||
/// возвращает True, если число простое и False в противном случае
|
||||
function IsPrime(Self: integer): boolean; extensionmethod := IsPrime(Self);
|
||||
|
||||
/// Простые числа на интервале [2;n]
|
||||
function Primes(n: integer): List<integer>;
|
||||
// Решето Эратосфена
|
||||
|
|
@ -732,44 +776,6 @@ begin
|
|||
Result.Add(i)
|
||||
end;
|
||||
|
||||
// Внутреняя процедура для заполнения LPrimes
|
||||
// Решето Эратосфена
|
||||
procedure PrimesInternal;
|
||||
begin
|
||||
LPrimes := new List<integer>;
|
||||
var Sieve := new boolean[ubPrimeDivs + 1];
|
||||
for var i := 2 to ubPrimeDivs do
|
||||
if not Sieve[i] then
|
||||
begin
|
||||
LPrimes.Add(i);
|
||||
var k := i;
|
||||
while k <= ubPrimeDivs - i do
|
||||
begin
|
||||
k += i;
|
||||
Sieve[k] := True
|
||||
end
|
||||
end
|
||||
end;
|
||||
|
||||
/// возвращает True, если число простое и False в противном случае
|
||||
function IsPrime(Self: integer): boolean; extensionmethod;
|
||||
begin
|
||||
if Self < 2 then
|
||||
Result := False
|
||||
else
|
||||
begin
|
||||
Result := True;
|
||||
foreach var prime in LPrimes do
|
||||
if Sqr(prime) > Self then
|
||||
break
|
||||
else if Self mod prime = 0 then
|
||||
begin
|
||||
Result := False;
|
||||
break
|
||||
end
|
||||
end
|
||||
end;
|
||||
|
||||
/// Простые числа на интервале [m;n]
|
||||
function Primes(m, n: integer): List<integer>;
|
||||
begin
|
||||
|
|
|
|||
Loading…
Reference in a new issue