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)));
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)));
end;

// Способ третий
// 1+2+3+...+n = n*(n+1)/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)));
end;

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

// 1+2+3+...+n = 1/2*n^2 + 1/2*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)));
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)));
end;

// Способ второй
// 1^2+2^2+3^2+...+n^2 = n(n+1)(2n+1)/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
// 1+2+3+...+n = n*(n+1)/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;

// 1^3+2^3+3^3+...+n^3 = n^2*(n+1)^2/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;

// 1^4+2^4+3^4+...+n^4 = n(n+1)(2n+1)(3n^2+3n-1)/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;