• Как сделать проверку числа на простоту?

    @bormant
    Hemul GM,
    но лучше так:
    function IsPrime(n: Longint): Boolean;
    var d, q: Integer;
    begin
      IsPrime:=False;
      if (n<2) or (n<>2) and not Odd(n) then Exit;
      q:=Trunc(SqRt(n)); d:=3;
      while (d<=q) and (n mod d<>0) do Inc(d,2);
      if d<=q then Exit;
      IsPrime:=True;
    end;


    Или так:
    function IsPrime(n: Longint): Boolean;
    var i, sqrtn, delta: Word;
    begin
      if (n >= 5) and ((n - 1) mod 6 = 0) or ((n + 1) mod 6 = 0) then begin
        i := 5;
        delta := 2;
        sqrtn := Trunc(sqrt(n));
        IsPrime := False;
        while i <= sqrtn do begin
          if n mod i = 0 then Exit;
          Inc(i, delta);
          delta := delta xor 6; {смена шага, то 2, то 4}
        end;
        IsPrime := True;
      end else
        IsPrime := (n = 2) or (n = 3);
    end;


    Или даже так:
    function IsPrime(n: Longint): Boolean;
    const delta: array [0..7] of Word = (4, 2, 4, 2, 4, 6, 2, 6);
    var i, j, sqrtn: Word;
    begin
      if (n >= 7) and ((n - 1) mod 6 = 0) or ((n + 1) mod 6 = 0) then begin
        i := 7; j := 0;
        sqrtn := Trunc(SqRt(n));
        IsPrime := False;
        while i <= sqrtn do begin
          if n mod i = 0 then Exit;
          Inc(i, delta[j]);
          Inc(j); if j = 8 then j := 0;
        end;
        IsPrime := True;
      end else
        IsPrime := (n = 2) or (n = 3) or (n = 5);
    end;


    Но если проверять несколько чисел, любое решето обычно быстрее.
    Написано
  • Как работает WriteLn в PascalAbc?

    @bormant
    ... нигде, кроме еще Write и Str ;-)
    Написано