Здравствуйте, столкнулся с проблемой "попытка деления на ноль"

Условие задачи: составное число называется числом Смита, если сумма его цифр равна сумме цифр всех чисел, образующихся разложением исходного числа на простые множители. Число Смита называется супер-числом Смита, если сумма его цифр является числом Смита. Найти супер-число Смита с номером N, являющееся полным квадратом. (Число называется полным квадратом, если корень квадратный из него является простым числом). При N=1 и N=2 всё работает, а вот при N=3 уже возникает попытка деления на ноль, подскажите, пожалуйста, в чём дело?

Var
Found,SFound  : boolean; {Флаг для цикла}
simple        : boolean; {Флаг, используемый при проверке на пр. число}
number,numb   : longint; {Число,с которого начинаем поиск...}
N             : longint; {Наше супер-число Смита}
i,u,v         : longint; {Счетчики для циклов}
Smith, SSmith : longint; {Искомое супер-число Смита}
SumNumb       : longint; {Сумма цифр числа}
SumSubs       : longint; {Сумма множителей}
amount        : longint; {Кол-во простых множителей}
numSum,numSub : longint; {Переменные для поиска сумм}
s,sfact,sum   : longint; {Результат вычислений}
a:array[1..1000] of integer;
aa:array[1..6000] of integer;

Begin
{ВВОД ЧИСЛА N}
write('Enter your number N: ');
readln(N);
{Поиск супер-числа Смита}
i:=0;
number:=1;
while i<>N do
begin
for u:=2 to 1000 do aa[u]:=u;
for u:=2 to 3000 do
begin
  if aa[u]<>0 then
  begin
    v:=2*u;
    while v<=6000 do
    begin
      aa[v]:=0;
      v:=v+u
    end
  end
end;
v:=2;
for u:=1 to 50 do
begin
  a[u]:= aa[v];
  v:=v+1;
  while aa[v]=0 do v:=v+1;
end;
  repeat
    SFound:=false;
    {Поиск числа Смита}  
    repeat 
      inc(number);
      Found:=false;
      SumNumb:=0;
      SumSubs:=0;
      numSum:=number;
      numSub:=number;
      {Подсчет суммы цифр числа} 
      s:=0;
      while numSum<>0 do
      begin
        inc(s,numSum mod 10);
        numSum:=numSum div 10;
      end;
      SumNumb:=s;
      {Подсчет суммы множителей числа}
      s:=0;
      u:=1;
      amount:=0;
      repeat
        if (numSub mod a[u])=0 then
          begin
            {Подсчитываем сумму цифр числа (множителя)}
            sfact:=0;
            numb:=a[u];
            while numb<>0 do
            begin
              inc(sfact,numb mod 10);
              numb:=numb div 10;
            end;
            sum:=sfact;
          {Подсчитываем сумму множителей}
            s:=s+sum;
            inc(amount);
            numSub:=numSub div a[u]
          end
          else inc(u);
      until numSub=1;
      SumSubs:=s;
      {Найденное число - это число Смита?}
      {Проверяем, чтобы сумма его цифр была равна сумме простых множителей}
      if ((SumNumb=SumSubs) and (amount>1)) then Found:=true;
    until Found=true;
    {Поиск супер-чисел Смита, удолетворяющих условиям}
    {Подсчет суммы цифр cупер-числа Смита}
     s:=0;
     numSum:=0;
     numSum:=number;
     while numSum<>0 do
     begin
       inc(s,numSum mod 10);
       numSum:=numSum div 10;
     end;
     SSmith:=s;
     {Проверка на супер-число Смита}
      SumNumb:=0;
      SumSubs:=0;
      numSum:=SSmith;
      numSub:=SSmith;
      {Подсчет суммы цифр числа} 
      s:=0;
      while numSum<>0 do
      begin
        inc(s,numSum mod 10);
        numSum:=numSum div 10;
      end;
      SumNumb:=s;
     {Подсчет суммы множителей числа}
      s:=0;
      u:=1;
      amount:=0;
      repeat
        if (numSub mod a[u])=0 then
          begin
            {Подсчитываем сумму цифр числа (множителя)}
            sfact:=0;
            numb:=a[u];
            while numb<>0 do
            begin
              inc(sfact,numb mod 10);
              numb:=numb div 10;
            end;
            sum:=sfact;
          {Подсчитываем сумму множителей}
            s:=s+sum;
            inc(amount);
            numSub:=numSub div a[u]
          end
          else inc(u);
       until numSub=1;
      SumSubs:=s;
    {Теперь еще проверим,чтобы это из корня кв. было простым числом}
     simple:=true;
     if Sqr(Trunc(Sqrt(number))) <> number then simple:=false;
    {Найденное число - это супер-число Смита?}
    {Проверяем, чтобы сумма его цифр являлась числом Смита}
    if ((SumNumb=SumSubs) and (amount>1) and (simple=true)) then SFound:=true;
  until SFound=true;
  inc(i); 
end;
Smith:=number;
{ВЫВОД СУПЕР-ЧИСЛА СМИТА}
writeln('Ваше супер-число Смита: ',Smith);
readln;
End.

Ответы (0 шт):