Здравствуйте, столкнулся с проблемой "попытка деления на ноль"
Условие задачи: составное число называется числом Смита, если сумма его цифр равна сумме цифр всех чисел, образующихся разложением исходного числа на простые множители. Число Смита называется супер-числом Смита, если сумма его цифр является числом Смита. Найти супер-число Смита с номером 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.