Числом Смита называется число,у которого сумма своих цифр равна сумме цифр всех простых делителей с учетом их кратностей в разложении на простые множители.Найти все числа Смита среди N чисел- Pascal(Паскаль)

{Эта функция считает сумму цифр числа N}
function GetOneDigits(n: LongInt): integer;
var s: Integer;
begin
  s := 0;
  while n <> 0 do begin
    Inc(s, n mod 10);
    n := n div 10
  end;
  GetOneDigits := s
end;
 
{Эта функция считает сумму цифр разложения исходного числа N
на простые множители и возвращает в Amount число простых множителей}
function GetSimpleDigits(n: LongInt;
         Var amount: Integer): Integer;
var
  s, factor: Integer;
begin
  s := 0; factor := 2;
  amount := 0;
  repeat
    if n mod factor = 0 then begin
      s := s + GetOneDigits(factor); Inc(amount);
      n := n div factor
    end
    else Inc(factor)
  until n = 1;
  GetSimpleDigits := s
end;
 
{Функция возвращает N-ное число Смита}
function GetSmith(n: Integer): LongInt;
var
  i, amount: Integer; od, sd: Integer;
  count: LongInt;
  Found: Boolean;
begin
  i := 0; count := 2;
  while i <> n do begin
    repeat
      Inc(count);
      Found :=
        (GetOneDigits(count) = GetSimpleDigits(count, amount)) and
        (amount > 1)
    until Found;
    inc(i)
  end;
  GetSmith := Count
end;
 
{Функция проверяет, является ли N числом Смита}
function IsSmith(n: LongInt): Boolean;
var
  i: Integer;
  next: LongInt;
begin
  i := 0;
  repeat
    Inc(i); next := GetSmith(i)
  until next >= n;
  IsSmith := (next = n)
end;
 
{Функция возвращает N-ное суперчисло Смита}
function Super(n: Integer): LongInt;
var
  i, count: Integer;
  smith: LongInt;
  Found: Boolean;
begin
  i := 0; count := 0;
  while i <> n do begin
    Inc(i);
    repeat
      Inc(count);
      smith := GetSmith(count);
      Found := IsSmith( GetOneDigits(smith) );
    until Found;
  end;
  Super := smith
end;
 
var
  X: Integer;
begin
  Write('X = '); ReadLn(X);
  WriteLn('Smith super number (X) = ', Super(X));
end.

Leave a Comment

+ 29 = 37