:: 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;
|
|