الگوریتم‌های کلاسیک

الگوریتم‌های محبوب: تشخیص عدد اول، عدد کامل، مجموع ارقام و ب.م.م.

باشگاه الگوریتم‌ها!

این‌ها الگوریتم‌هایی هستند که در هر زبانی تمرین می‌شوند — و پاسکال زبان ایده‌آل تمرین الگوریتم است!

۱. تشخیص عدد اول

عدد اول فقط بر ۱ و خودش بخش‌پذیر است (مثل ۲، ۳، ۵، ۷، ۱۱...):

function IsPrime(n: integer): boolean;
var
  i: integer;
begin
  if n < 2 then exit(false);
  if n = 2 then exit(true);
  if n mod 2 = 0 then exit(false);

  Result := true;
  i := 3;
  while i * i <= n do
  begin
    if n mod i = 0 then
    begin
      Result := false;
      break;
    end;
    i := i + 2;   { فقط فردها }
  end;
end;
ترفند سرعت: فقط تا √n بررسی می‌کنیم — اگر مقسوم‌علیهی بالاتر از √n باشد، جفتی زیر √n هم هست!

۲. عدد کامل (Perfect Number)

عددی که برابر مجموع مقسوم‌علیه‌هایش (غیر از خودش) است: ۶ = ۱+۲+۳

function IsPerfect(n: integer): boolean;
var
  i, s: integer;
begin
  s := 0;
  for i := 1 to n div 2 do
    if n mod i = 0 then
      s := s + i;
  Result := (s = n);
end;

۳. ب.م.م با الگوریتم اقلیدس

function GCD(a, b: integer): integer;
begin
  while b <> 0 do
  begin
    a := a mod b;
    { جابجایی }
    if b <> 0 then
    begin
      temp := a; a := b; b := temp;
    end;
  end;
  Result := a;
end;

نسخه بازگشتی تمیزتر:

function GCD(a, b: integer): integer;
begin
  if b = 0 then exit(a)
  else exit(GCD(b, a mod b));
end;

۴. عدد آرمسترانگ (Armstrong)

عددی که برابر مجموع مکعب ارقامش است: ۱۵۳ = ۱³+۵³+۳³

function IsArmstrong(n: integer): boolean;
var
  m, s, d: integer;
begin
  m := n;
  s := 0;
  while m > 0 do
  begin
    d := m mod 10;
    s := s + d * d * d;
    m := m div 10;
  end;
  Result := (s = n);
end;

۵. دنباله فیبوناچی (نسخه حلقه)

procedure PrintFib(count: integer);
var
  a, b, temp, i: integer;
begin
  a := 0;
  b := 1;
  for i := 1 to count do
  begin
    write(a, ' ');
    temp := a + b;
    a := b;
    b := temp;
  end;
  writeln;
end;

۶. عدد دودویی (Binary)

procedure PrintBinary(n: integer);
var
  bits: string;
  m: integer;
begin
  m := n;
  bits := '';
  if m = 0 then bits := '0';
  while m > 0 do
  begin
    if m mod 2 = 0 then
      bits := '0' + bits
    else
      bits := '1' + bits;
    m := m div 2;
  end;
  writeln(n, ' = ', bits);
end;

خلاصه

این مبحث بخشی از دوره آموزش کامل پاسکال است.

ابزارهای مرتبط