Задача: Рассмотрим последовательность, образованную дробями: 1/1, 2/1, 3/2, …, в которой числитель (знаменатель) следующего члена последовательности получается сложением числителей (знаменателей) двух предыдущих членов. Числители двух первых дробей равны 1 и 2, знаменатели — 1 и 1. а) Найти k-й член этой последовательности; б) Получить первые n членов этой последовательности. в) Верно ли, что сумма первых n членов этой последовательности больше числа А?
Анализ задачи
Вначале стоит проанализировать условия лабораторной работы. Итак, по условиям задачи первые две дроби строго заданы:
Числители двух первых дробей равны 1 и 2, знаменатели — 1 и 1
то есть — это дроби 1/1
и 2/1
Все следующие члены последовательности должны рассчитываться по заданному условию:
числитель (знаменатель) следующего члена последовательности получается сложением числителей (знаменателей) двух предыдущих членов
то есть, чтобы узнать третью дробь — мы должны помнить первую и вторую дроби, чтобы узнать десятую дробь — мы должны знать девятую и восьмую и т.д. При этом, мы должны знать отдельно значение числителя и знаменателя, чтобы складывать их.
Теперь посмотрим на вопросы, которые нам необходимо решить.
Найти k-й член этой последовательности;
По этому условию нас никак не ограничивают какой член последовательности необходимо посчитать — первый, сотый или тысячный.
б) Получить первые n членов этой последовательности
Это условие указывает нам, что при расчёте k-го члена последовательности нам необходимо выводить на экран расчёты всех предыдущих членов последовательности.
в) Верно ли, что сумма первых n членов этой последовательности больше числа А?
Это условие указывает на то, что мы при получении каждого члена последовательности должны рассчитать сумму всех рассчитанных членов последовательности, чтобы иметь возможность сравнить эту сумму с числом A
, которое пользователь должен задать.
Задачи на последовательности, обычно, решаются с помощью циклов, если вы новичок в C# или же с использованием LINQ, если вы уже знаете основы .NET и C#. Мы будем решать эту лабораторную работу с использованием цикла.
Алгоритм решения
Алгоритм решения лабораторной работы может быть таким:
- Пользователь вводит числа
k
иA
- Если
k<=0
, то задача не решается — выводим сообщение на экран и завершаем работу - Задаем два массива по два элемента — массивы будут содержать значения предыдущих двух дробей. По умолчанию, это будут первые два элемента последовательности
- Если
k = 1
илиk = 2
, то необходимо вывести значения первой или второй дроби, которые у нас строго заданы. - Если
k>2
, то необходимо рассчитать числитель и знаменатель дроби, используя числители и знаменатели для предыдущих двух дробей. - Меняем местами значения в массивах и записываем во вторые элементы массивов числитель и знаменатель новой дроби.
- Считаем сумму членов последовательности
- Сравниваем итоговую сумму с числом
A
и выводим результаты на экран
Самый, наверное, сложный момент, который может возникнуть при решении лабораторной работы — это запомнить предыдущие дроби. Попробуем проиллюстрировать этот момент:
Желтым цветом выделены дроби, которые необходимо посчитать, зеленым — числители и знаменатели дробей, которые необходимо запомнить. На рисунке, в качестве примера, показан расчёт третьего и восьмого члена последовательности.
Теперь попробуем реализовать этот алгоритм в C#.
Решение лабораторной работы (исходный код)
Исходный код C# с решением лабораторной работы и комментариями представлен ниже:
Console.WriteLine("Какой член последовательности необходимо найти?"); Console.Write("k = "); var k = Convert.ToInt32(Console.ReadLine()); Console.WriteLine("С каким числом сравнивать сумму членов последовательности?"); Console.Write("A = "); var a = Convert.ToInt32(Console.ReadLine()); int[] numerators = [1, 2]; //числители предыдущих двух дробей int[] denominators = [1, 1]; //знаменатели предыдущих двух дробей if (k == 0) //задача не решается { Console.WriteLine("Нет ответа на ваш запрос"); } else { int numerator; //числитель очередной дроби int denominator; //знаменатель очередной дроби double sum = 0; //сумма всех членов последовательности int i = 1; //текущий член последовательности while (i <= k) //считаем пока не дойдем до k-го члена последовательности { if (i <= 2) { //если определяются первые два элемента, то просто выводим результат numerator = numerators[i - 1]; denominator = denominators[i - 1]; } else { //нужен элемент последовательности с номером больше 2 - необходимо рассчитать числитель и знаменатель numerator = numerators[0] + numerators[1]; denominator = denominators[0] + denominators[1]; //"сдвигаем" вторые элементы массива на первое место numerators[0] = numerators[1]; denominators[0] = denominators[1]; //записываем во вторые элементы массивов полученные значения новой дроби //таким образом, мы "запоминаем" предыдущие два члена последовательности numerators[1] = numerator; denominators[1] = denominator; } //считаем сумму всех n членов последовательности sum += numerator / (float)denominator; //выводим результат на экран Console.WriteLine($"{i}-й член последовательности {numerator}/{denominator}. Сумма первых {i} членов {sum}"); //не забываем наращивать счётчик цикла, чтобы не уйти в бесконечный цикл i++; } //сравниваем сумму с числом A if (sum > a) Console.WriteLine($"ДА, сумма первых {k} членов последовательности БОЛЬШЕ {a}"); else Console.WriteLine($"НЕТ, сумма первых {k} членов последовательности МЕНЬШЕ {a}"); }
Здесь мы использовали для работы цикл с предусловием, хотя, при желании, могли бы использовать, в принципе, любой цикл. Проверим результат работы нашего приложения
k = 10
С каким числом сравнивать сумму членов последовательности?
A = 10
1-й член последовательности 1/1. Сумма первых 1 членов 1
2-й член последовательности 2/1. Сумма первых 2 членов 3
3-й член последовательности 3/2. Сумма первых 3 членов 4,5
4-й член последовательности 5/3. Сумма первых 4 членов 6,166666626930237
5-й член последовательности 8/5. Сумма первых 5 членов 7,766666650772095
6-й член последовательности 13/8. Сумма первых 6 членов 9,391666650772095
7-й член последовательности 21/13. Сумма первых 7 членов 11,007051229476929
8-й член последовательности 34/21. Сумма первых 8 членов 12,626098871231079
9-й член последовательности 55/34. Сумма первых 9 членов 14,243745923042297
10-й член последовательности 89/55. Сумма первых 10 членов 15,86192774772644
ДА, сумма первых 10 членов последовательности БОЛЬШЕ 10
Итого
Таким образом, для решения этой лабораторной работы нам потребовались знания по таким темам программирования в C#, как «Массивы» и «Циклы«. В этой лабораторной работе мы научились применять циклы для определения членов последовательности и рассчитывать сумму первых n
членов заданной последовательности.