Числа Смита (Не проходит все тесты) - Free Pascal

Узнай цену своей работы

Формулировка задачи:

Число Смита — такое составное число, сумма цифр которого равняется сумме цифр всех его простых сомножителей. Так, примером числа Смита может служить 202, поскольку 2 + 0 + 2 = 4 и 2 + 1 + 0 + 1 = 4 (202 = 2 * 101). Напишите программу, которая для заданной последовательности чисел определяет, какие из них являются числами Смита. На входе не более 20 натуральных чисел в пределах от 4 до 106. Нужно вывести строку из 0 и 1 (1, если соответствующее число является числом Смита и 0 иначе). Написал вот такую более менее понятную программку
Листинг программы
  1. const K=1000000;
  2. var d:longint; p:array [2..K] of boolean;//Массив для простых чисел
  3. function SumOfDigits(n:longint):longint;//Функция вычисления суммы цифр числа
  4. var sum:longint;
  5. begin
  6. sum:=0;
  7. while n<>0 do
  8. begin
  9. sum:=sum+(n mod 10);
  10. n:= n div 10;
  11. end;
  12. SumOfDigits:=sum;
  13. end;
  14. procedure FillPrime;//Процедура заполнения массива простых чисел
  15. var i,j:longint;
  16. begin
  17. for i:=2 to trunc(sqrt(K)) do
  18. begin
  19. j:=i*i;
  20. while (j<=K) do
  21. begin
  22. p[j]:=True;//True если число не простое
  23. inc(j,i);
  24. end;
  25. end;
  26. end;
  27. function SumOfPrimeDigits(n:longint):longint;//Сумма цифр всех простых делителей
  28. var j:longint; sum:longint;
  29. begin
  30. sum:=0;
  31. j:=2;
  32. while (j<=K) do
  33. begin
  34. if p[j]=True then///Если число не простое то пропустить итерацию
  35. begin
  36. inc(j);
  37. continue;
  38. end;
  39. if n mod j=0 then///Если простое и является делителем
  40. begin
  41. sum:=sum+SumOfDigits(j);//Тут думаю понятно
  42. n:=n div j;
  43. end else inc(j);
  44. if n=1 then break;
  45. end;
  46. SumOfPrimeDigits:=sum;
  47. end;
  48. begin
  49. FillPrime;
  50. while not eof do
  51. begin
  52. read(d);
  53. if (p[d]) and (SumOfDigits(d)=SumOfPrimeDigits(d)) then write(1) else write(0); ///Если число составное и ...
  54. end;
  55. end.
Пример проходит: 4 20 17 202 1001 Не понимаю где может быть ошибка
Если так будет проще, напишите свой код. Попробую найти у себя ошибку.

Решение задачи: «Числа Смита (Не проходит все тесты)»

textual
Листинг программы
  1. function SumCif(a:longint):byte;
  2. var s,k:longint;
  3. begin
  4. k:=a;
  5. s:=0;
  6. while k>0 do
  7.  begin
  8.   s:=s+k mod 10;
  9.   k:=k div 10;
  10.  end;
  11. SumCif:=s;
  12. end;
  13. function Smit(k:longint):boolean;
  14. var n,a:longint;
  15.     b:boolean;
  16.     s:byte;
  17. begin
  18. a:=k;
  19. n:=2;
  20. s:=0;
  21. b:=false;
  22. while (n<=trunc(sqrt(a)))and not b do
  23. if a mod n=0 then b:=true
  24. else inc(n);
  25. if b then
  26.  begin
  27.   a:=k;
  28.   n:=2;
  29.   while n<=a do
  30.    begin
  31.     while a mod n=0 do
  32.      begin
  33.       s:=s+SumCif(n);
  34.       a:=a div n;
  35.      end;
  36.     inc(n);
  37.    end;
  38.  end;
  39. Smit:=(SumCif(k)=s) and b;
  40. end;
  41.  
  42. var i:Longint;
  43. begin
  44. while not seekeof do
  45.  begin
  46.   read(i);
  47.   if Smit(i) then write(1)else write(0);
  48.  end;
  49. end.

Объяснение кода листинга программы

  1. Функция SumCif принимает целое число (a) и возвращает сумму его цифр, представленную в виде байта.
  2. Переменные k и s инициализируются значением a.
  3. Цикл while выполняет перебор цифр числа a (начиная с самой старшей), добавляя их к переменной s.
  4. Функция Smit принимает целое число (k) и возвращает true, если число является числом Смита, и false в противном случае.
  5. Переменные a, n и s инициализируются значением k.
  6. Переменная b инициализируется значением false.
  7. Цикл while выполняет перебор чисел от 2 до корня из числа a (с округлением вниз), проверяя, делится ли число a на это число без остатка.
  8. Если число a делится без остатка на текущее значение переменной n, то значение переменной b становится true.
  9. Если значение переменной b становится true, то выполняется цикл while, который перебирает все числа от 2 до значения переменной a, проверяя, делится ли число a на это число без остатка.
  10. Если число a делится без остатка на текущее значение переменной n, то значение переменной s увеличивается на значение функции SumCif, которая вызывается с текущим значением переменной n.
  11. Значение переменной a уменьшается на значение n (поскольку число a было разделено на n без остатка).
  12. Значение переменной n увеличивается на единицу.
  13. После выхода из цикла while значение переменной s содержит сумму цифр числа a.
  14. Значение переменной b становится true, если значение переменной s равно значению функции SumCif, переданной значение переменной k, и false в противном случае.
  15. В основной части программы выполняется цикл while, который считывает числа до тех пор, пока не достигнет конца файла.
  16. Каждое считанное число проверяется с помощью функции Smit.
  17. Если число является числом Смита, то на выход записывается единица, в противном случае - ноль.
  18. Цикл while продолжается до тех пор, пока не будет достигнут конец файла.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

7   голосов , оценка 4.429 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы