Найти m-й член последовательности - Turbo Pascal

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

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

Найти m-й член последовательности {an}, если известно, что a1=k (натуральное число), ai+1=2ai-1 , где i=1,2,3,... , и определить, встречается ли в записи результата, хотя бы один раз, цифра 7.

Решение задачи: «Найти m-й член последовательности»

textual
Листинг программы
  1. procedure rd(s: string; var x: longint); {процедура ввода числа с проверкой}
  2. begin
  3.   repeat
  4.     write(s, ' > 0; ', s, ' = ');
  5.     readln(x)
  6.   until x > 0
  7. end;
  8.  
  9. var k, m, a: longint;
  10.     f: boolean;
  11. begin
  12.   rd('k', k); {ввод k с проверкой}
  13.   rd('m', m); {ввод m с проверкой}
  14.   if (k > 1) and (m > 30 - trunc(ln(k) / ln(2))) {проверяем, поместится ли в longint}
  15.     then write('Integer overflow') {не помещается}
  16.     else begin {помещается}
  17.       if k = 1 {если k = 1}
  18.         then a := 1 {то a(m) = 1 при любом m}
  19.         else a := (k - 1) shl (m - 1) + 1; {иначе вычисляем a}
  20.       writeln('a(', m, ') = ', a); {печатаем a}
  21.       while a > 0 do {выясняем, есть ли цифра 7}
  22.         begin
  23.           f := a mod 10 = 7; {проверяем младший разряд}
  24.           if f then break; {если равен 7, то досрочно выходим из цикла}
  25.           a := a div 10 {укорачиваем число на один разряд}
  26.         end;
  27.       writeln('Digit "7" on number: ', f) {печатаем, есть ли 7}
  28.     end;
  29.   readln
  30. end.

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

  1. В процедуре rd введен код для чтения числа с проверкой. Число считывается с консоли и записывается в переменную x. Если число меньше или равно нулю, то цикл повторяется, пока x не станет больше нуля.
  2. Далее объявлены три переменные: k, m и a. Переменная k содержит значение, введенное пользователем, а переменная m содержит значение, которое может быть хранено в longint без переполнения. Переменная a используется для хранения результата вычисления a(m).
  3. Затем выполняется проверка на переполнение при использовании k и m. Если k больше 1 и m больше 30 - trunc(ln(k) / ln(2)), то выводится сообщение об ошибке Integer overflow, что означает переполнение целого числа.
  4. Если условие проверки не выполняется, то вычисляется значение a(m). Если k равно 1, то a(m) равно 1. В противном случае вычисляется a(m) как (k - 1) shl (m - 1) + 1.
  5. Затем выводится значение a(m) с помощью функции writeln.
  6. После этого выполняется цикл while, который продолжается, пока a(m) не станет равным нулю. В каждой итерации цикла проверяется, является ли последний разряд числа a(m) равным 7 с помощью оператора mod 10 = 7. Если это так, то выполняется команда break, чтобы выйти из цикла.
  7. Если в конце цикла значение a(m) все еще больше нуля, то выводится сообщение Digit7on number:, указывающее, что в числе была цифра 7.
  8. Наконец, вызывается функция readln, чтобы прочитать введенные пользователем данные и завершить программу.

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


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

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

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

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

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

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