FAQ VCL
Математика

:: Меню ::
:: На главную ::
:: FAQ ::
:: Заметки ::
:: Практика ::
:: Win API ::
:: Проекты ::
:: Скачать ::
:: Секреты ::
:: Ссылки ::

:: Сервис ::
:: Написать ::

:: MVP ::

:: RSS ::

Яндекс.Метрика

Как вычислить сумму ряда 1+2+3+...+n?

// Способ первый
function Summ(n: Cardinal): Int64;
var
  i: Integer;
begin
   Result := 1;
   for i := 2 to n do
      Inc(Result, i);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
   ShowMessage(IntToStr(Summ(15))); // 120
end;

// Способ второй
function Summ(n: Integer): Int64;
begin
  if n = 0 then
    Result := 0
  else
    Result := n + Summ(n-1);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  ShowMessage(IntToStr(Summ(15))); // 120
end;

// Способ третий
// Способ третий
//               n*(n+1)
// 1+2+3+...+n = -------
//                  2
function Summ(n: Cardinal): Int64;
begin
  Result := (n * (n + 1)) shr 1;
  // shr 1 = div 2
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  ShowMessage(IntToStr(Summ(15))); // 120
end;

// Способ четвертый
uses
  Math;

// 1+2+3+...+n = 0.5*n^2 + 0.5*n
function Summ(n: Cardinal): Int64;
begin
  Result := Trunc((0.5 * Power(n, 2)) + (0.5*n));
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  ShowMessage(IntToStr(Summ(15))); // 120
end;


Как вычислить сумму ряда 1^2+2^2+3^2+...+n^2?

// Способ первый
uses
  Math;

function Summ(n: Cardinal): Int64;
var
  i: Integer;
begin
  Result := 1;
  for i := 2 to n do
    Inc(Result, Trunc(Power(i, 2)));
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  ShowMessage(IntToStr(Summ(15))); // 1240
end;

// Способ второй
//                       n*(n+1)*(2n+1)
// 1^2+2^2+3^2+...+n^2 = --------------
//                             6
function Summ(const n: Integer): Int64;
begin
  Result := Trunc(n * (n+1) * (2*n+1) / 6);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  ShowMessage(IntToStr(Summ(15)));
end;

// Способ третий
uses
  Math;

// 1^2+2^2+3^2+...+n^2 = 1/3*n^3 + 1/2*n^2 + 1/6*n
function Summ(const n: Integer): Int64;
begin
  Result := Trunc((1/3 * Power(n, 3)) + (0.5 * Power(n, 2)) + (1/6*n));
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  ShowMessage(IntToStr(Summ(15)));
end;


Как вычислить сумму ряда 1^3+2^3+3^3+...+n^3?

// Способ первый
uses
  Math;

function Summ(n: Cardinal): Int64;
var
  i: Integer;
begin
  Result := 1;
  for i := 2 to n do
    Inc(Result, Trunc(Power(i, 3)));
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  ShowMessage(IntToStr(Summ(15)));
end;

// Способ второй
uses
  Math;

// 1^3+2^3+3^3+...+n^3 = (1+2+3+...+n)^2
//               n*(n+1)
// 1+2+3+...+n = -------
//                 2
function Summ(n: Cardinal): Int64;
begin
  Result := Trunc(Power(n * (n+1) / 2, 2));
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  ShowMessage(IntToStr(Summ(15)));
end;

// Способ третий
uses
  Math;

//                       n^2*(n+1)^2
// 1^3+2^3+3^3+...+n^3 = -----------
//                           4
function Summ(n: Cardinal): Int64;
begin
  Result := Trunc(Power(n, 2) * Power(n+1, 2) / 4);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  ShowMessage(IntToStr(Summ(15)));
end;

// Способ четветрый
uses
  Math;

// 1^3+2^3+3^3+...+n^3 = 1/4*n^4 + 1/2*n^3 + 1/4*n^2
function Summ(n: Cardinal): Int64;
begin
  Result := Trunc((1/4 * Power(n, 4)) + (0.5 * Power(n, 3)) + (1/4 * Power(n, 2)));
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  ShowMessage(IntToStr(Summ(15)));
end;


Как вычислить сумму ряда 1^4+2^4+3^4+...+n^4?

// Способ первый
uses
  Math;

function Summ(n: Cardinal): Int64;
var
  i: Integer;
begin
  Result := 1;
  for i := 2 to n do
    Inc(Result, Trunc(Power(i, 4)));
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  ShowMessage(IntToStr(Summ(15)));
end;

// Способ второй
uses
  Math;

//                       n*(n+1)*(2n+1)*(3n^2+3n-1)
// 1^4+2^4+3^4+...+n^4 = --------------------------
//                                  30
function Summ(n: Cardinal): Int64;
begin
  Result := Trunc(n * (n+1) * (2*n+1) * (3 * Power(n, 2)+3 * n-1) / 30);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
   ShowMessage(IntToStr(Summ(15)));
end;


Как выбрать максимальное значение из двух целочисленных переменных без использования if?

// Способ первый
function Max(a, b: Integer): Integer;
begin
  Result := (a + b + abs(a-b)) div 2;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  ShowMessage(Max(2, -5).ToString);
end;

// Способ второй
function Max(a, b: Integer): Integer;
var
  c, k: Integer;
begin
  c := a - b;
  k := (c shr 31) and 1;
  Result := a - k * c;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  ShowMessage(Max(2, -5).ToString);
end;

// Способ третий
function Max(a, b: Integer): Integer;
begin
  Result := Trunc((a+b)/2 + abs((a-b)/2));
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  ShowMessage(Max(2, -5).ToString);
end;

// Способ четвертый
function Max(a, b: Integer): Integer;
begin
  Result := Trunc((Sqrt(a*a + b*b - 2*a*b) + a + b) / 2);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  ShowMessage(Max(2, -5).ToString);
end;

// Способ пятый
uses
  Math;

function Max(a, b: Integer): Integer;
var
  arr: array[0..2] of Integer;
begin
  arr[0] := b;
  arr[1] := a;
  arr[2] := a;
  Result := arr[Sign(a - b) + 1];
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  ShowMessage(Max(2, -5).ToString);
end;

// Способ шестой
// (a > b)*a + (a < b)*b
{Отражение 1 в 0 и 0 в 1}
function Flip(Bit: Integer): Integer;
begin
  Result := 1 xor Bit;
end;

{Возвращает 1, если число положительное, и 0, если отрицательное}
function Sign(a: Integer): Integer;
const
  CHAR_BIT = 8;
begin
  Result := Flip((a shr (SizeOf(Integer) * CHAR_BIT - 1))) and 1;
end;

function Max(a, b: Integer): Integer;
begin
  Result := Sign(a-b)*a + Sign(b-a)*b;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  ShowMessage(Max(2, -5).ToString);
end;

// Способ седьмой
{Отражение 1 в 0 и 0 в 1}
function Flip(Bit: Integer): Integer;
begin
  Result := 1 xor Bit;
end;

{Возвращает 1, если число положительное, и 0, если отрицательное}
function Sign(a: Integer): Integer;
const
  CHAR_BIT = 8;
begin
  Result := Flip((a shr (SizeOf(Integer) * CHAR_BIT - 1))) and 1;
end;

function Max(a, b: Integer): Integer;
begin
  Result := a xor ((a xor b) and -Sign(b - a));
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  ShowMessage(Max(2, -5).ToString);
end;


Как выбрать минимальное значение из двух целочисленных переменных без использования if?

// Способ первый
function Max(a, b: Integer): Integer;
begin
  Result := Trunc((a+b)/2 - abs((a-b)/2));
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  ShowMessage(Max(2, -5).ToString);
end;

// Способ второй
{Отражение 1 в 0 и 0 в 1}
function Flip(Bit: Integer): Integer;
begin
  Result := 1 xor Bit;
end;

{Возвращает 1, если число положительное, и 0, если отрицательное}
function Sign(a: Integer): Integer;
const
  CHAR_BIT = 8;
begin
  Result := Flip((a shr (SizeOf(Integer) * CHAR_BIT - 1))) and 1;
end;

function Max(a, b: Integer): Integer;
begin
  Result := a xor ((a xor b) and -Sign(a - b));
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  ShowMessage(Max(2, -5).ToString);
end;

// Способ третий
uses
  Math;

function Max(a, b: Integer): Integer;
var
  arr: array[0..2] of Integer;
begin
  arr[0] := b;
  arr[1] := a;
  arr[2] := a;
  Result := arr[Sign(b - a) + 1];
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  ShowMessage(Max(2, -5).ToString);
end;


Как проверить является ли число простым?

// Способ первый
function IsPrime(n: Integer): Boolean;
var
  i, k: Integer;
begin
  if n <= 3 then
    IsPrime := n > 1
  else if ((n mod 2) = 0) or ((n mod 3) = 0) then
    IsPrime := False
  else
  begin
    IsPrime := True;
    k := Trunc(Sqrt(n));
    i := 5;
    while i <= k do
    begin
      if ((n mod i) = 0) or ((n mod (i + 2)) = 0) then
      begin
        IsPrime := False;
        Break;
      end;
      i := i + 6;
    end;
  end;
end;

// Способ второй
function IsPrime(x: LongInt): Boolean;
var
  i: Integer;
begin
  Result := False;

  if x < 2 then
    Exit;

  if not Odd(x) and (x <> 2) then // Проверка на чётность
    Exit;

  i := 3;
  while i <= Sqrt(x) do // Проверяем только нечётные
  begin
    if x mod i = 0 then
      Exit;
    Inc(i, 2);
  end;

  Result := True;
end;


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

uses
  Math;

function DotInCircle(Center, Dot: TPoint; Radius: Cardinal): Boolean;
begin
  Result := Power(Dot.X-Center.X, 2) + Power(Dot.Y-Center.Y, 2) <= Power(Radius, 2);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  if DotInCircle(Point(10, 10), Point(10, 3), 7) then
    ShowMessage('Точка (10, 3) попадает в окружность');

  if DotInCircle(Point(10, 10), Point(10, 2), 7) then
    ShowMessage('Точка (10, 2) попадает в окружность');
end;


Как получить остаток от деления вещественных чесел?

uses
  Math;

function ModXY(x, y: Extended; Digit: TRoundToEXRangeExtended = -2): Extended;
begin
  Result := RoundTo(x - y * Floor(x/y), Digit);
// Result := RoundTo(x - y * Trunc(x/y), Digit);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  ShowMessage(ModXY(4.7, 1.5).ToString);
end;


Как реализовать XOR используя элементарные функции?

procedure TForm1.Button1Click(Sender: TObject);
const
  a = 1;
  b = 2;
begin
  // a xor b = (a and (not b)) or ((not a) and b)
  ShowMessage(((a and (not b)) or ((not a) and b)).ToString);
end;