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

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

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

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

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

textual
Листинг программы
procedure rd(s: string; var x: longint); {процедура ввода числа с проверкой}
begin
  repeat
    write(s, ' > 0; ', s, ' = ');
    readln(x)
  until x > 0
end;
 
var k, m, a: longint;
    f: boolean;
begin
  rd('k', k); {ввод k с проверкой}
  rd('m', m); {ввод m с проверкой}
  if (k > 1) and (m > 30 - trunc(ln(k) / ln(2))) {проверяем, поместится ли в longint}
    then write('Integer overflow') {не помещается}
    else begin {помещается}
      if k = 1 {если k = 1}
        then a := 1 {то a(m) = 1 при любом m}
        else a := (k - 1) shl (m - 1) + 1; {иначе вычисляем a}
      writeln('a(', m, ') = ', a); {печатаем a}
      while a > 0 do {выясняем, есть ли цифра 7}
        begin
          f := a mod 10 = 7; {проверяем младший разряд}
          if f then break; {если равен 7, то досрочно выходим из цикла}
          a := a div 10 {укорачиваем число на один разряд}
        end;
      writeln('Digit "7" on number: ', f) {печатаем, есть ли 7}
    end;
  readln
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
Похожие ответы