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