Числа Смита (Не проходит все тесты) - Free Pascal
Формулировка задачи:
Число Смита — такое составное число, сумма цифр которого равняется сумме цифр всех его простых сомножителей. Так, примером числа Смита может служить 202, поскольку 2 + 0 + 2 = 4 и 2 + 1 + 0 + 1 = 4 (202 = 2 * 101). Напишите программу, которая для заданной последовательности чисел определяет, какие из них являются числами Смита.
На входе не более 20 натуральных чисел в пределах от 4 до 106.
Нужно вывести строку из 0 и 1 (1, если соответствующее число является числом Смита и 0 иначе).
Написал вот такую более менее понятную программку
Пример проходит:
4 20 17 202
1001
Не понимаю где может быть ошибка
const K=1000000; var d:longint; p:array [2..K] of boolean;//Массив для простых чисел function SumOfDigits(n:longint):longint;//Функция вычисления суммы цифр числа var sum:longint; begin sum:=0; while n<>0 do begin sum:=sum+(n mod 10); n:= n div 10; end; SumOfDigits:=sum; end; procedure FillPrime;//Процедура заполнения массива простых чисел var i,j:longint; begin for i:=2 to trunc(sqrt(K)) do begin j:=i*i; while (j<=K) do begin p[j]:=True;//True если число не простое inc(j,i); end; end; end; function SumOfPrimeDigits(n:longint):longint;//Сумма цифр всех простых делителей var j:longint; sum:longint; begin sum:=0; j:=2; while (j<=K) do begin if p[j]=True then///Если число не простое то пропустить итерацию begin inc(j); continue; end; if n mod j=0 then///Если простое и является делителем begin sum:=sum+SumOfDigits(j);//Тут думаю понятно n:=n div j; end else inc(j); if n=1 then break; end; SumOfPrimeDigits:=sum; end; begin FillPrime; while not eof do begin read(d); if (p[d]) and (SumOfDigits(d)=SumOfPrimeDigits(d)) then write(1) else write(0); ///Если число составное и ... end; end.
Если так будет проще, напишите свой код. Попробую найти у себя ошибку.
Решение задачи: «Числа Смита (Не проходит все тесты)»
textual
Листинг программы
function SumCif(a:longint):byte; var s,k:longint; begin k:=a; s:=0; while k>0 do begin s:=s+k mod 10; k:=k div 10; end; SumCif:=s; end; function Smit(k:longint):boolean; var n,a:longint; b:boolean; s:byte; begin a:=k; n:=2; s:=0; b:=false; while (n<=trunc(sqrt(a)))and not b do if a mod n=0 then b:=true else inc(n); if b then begin a:=k; n:=2; while n<=a do begin while a mod n=0 do begin s:=s+SumCif(n); a:=a div n; end; inc(n); end; end; Smit:=(SumCif(k)=s) and b; end; var i:Longint; begin while not seekeof do begin read(i); if Smit(i) then write(1)else write(0); end; end.
Объяснение кода листинга программы
- Функция SumCif принимает целое число (a) и возвращает сумму его цифр, представленную в виде байта.
- Переменные k и s инициализируются значением a.
- Цикл while выполняет перебор цифр числа a (начиная с самой старшей), добавляя их к переменной s.
- Функция Smit принимает целое число (k) и возвращает true, если число является числом Смита, и false в противном случае.
- Переменные a, n и s инициализируются значением k.
- Переменная b инициализируется значением false.
- Цикл while выполняет перебор чисел от 2 до корня из числа a (с округлением вниз), проверяя, делится ли число a на это число без остатка.
- Если число a делится без остатка на текущее значение переменной n, то значение переменной b становится true.
- Если значение переменной b становится true, то выполняется цикл while, который перебирает все числа от 2 до значения переменной a, проверяя, делится ли число a на это число без остатка.
- Если число a делится без остатка на текущее значение переменной n, то значение переменной s увеличивается на значение функции SumCif, которая вызывается с текущим значением переменной n.
- Значение переменной a уменьшается на значение n (поскольку число a было разделено на n без остатка).
- Значение переменной n увеличивается на единицу.
- После выхода из цикла while значение переменной s содержит сумму цифр числа a.
- Значение переменной b становится true, если значение переменной s равно значению функции SumCif, переданной значение переменной k, и false в противном случае.
- В основной части программы выполняется цикл while, который считывает числа до тех пор, пока не достигнет конца файла.
- Каждое считанное число проверяется с помощью функции Smit.
- Если число является числом Смита, то на выход записывается единица, в противном случае - ноль.
- Цикл while продолжается до тех пор, пока не будет достигнут конец файла.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д