Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- Var
- B: Array [1..50] Of LongInt; R, U, D, F: Double;
- {B - По условию нам даны натуральные числа от b1 до b50. Какие именно - не сказано.
- Вполне разумно, что группу этих натуральных чисел можно представить как одномерный массив,
- поэтому я объявил целочисленный массив B размером в 50 значений.
- R - по условию, в этой переменной должен оказаться результат. Т.к в расчетах будет использоваться
- деление, переменная, как и все остальные, объявлена вещественной, т.е может принимать и не целые значения.
- U и D: Это промежуточные переменные, в U записывается результат вычисления числителя текущей дроби, в D - знаменателя}
- F - промежуточная переменная, принимающая значение результата исполнения функции нахождения факториала.
- I, II: Integer;
- {В моих программах, переменные с именами I и II всегда являются индексами для массивов,
- обычно I - это основной индекс, а II - дополнительный, как, например, в предыдущей задаче.
- По этим переменным крутятся циклы For.}
- FT1, FT2: LongInt;
- {FT1 и FT2 - промежуточные переменные, в них помещается результат вычисления функции F(B(i)) на каждой
- итерации. Функции исполняются как в числителе, так и в знаменателе, поэтому этих переменных две штуки.}
- Begin
- {Из условия задачи не известно, какие натуральные числа нам даны. Можно было сделать, чтобы они
- вводились с клавиатуры, но я решил просто задать их значения по порядку, с 1 до 50, что цикл снизу
- и делает.}
- For I:= 1 To 50 Do B[I]:= I;
- {Теперь смотрим. В этой огромной дроби наша задача - посчитать числитель со знаменателем, потом только
- поделить. В числителе и знаменателе также присутствуют дроби, которые придется считать отдельно.
- При этом, как в числителе, так и в знаменателе требуется подсчитать сумму этих дробей по заданному
- правилу. Потребуется цикл. В данном варианте мы будем увеличивать текущий индекс не на 1, а сразу на 2,
- поэтому потребуется использовать цикл While, а не For
- Начнем с первого элемента последовательности, стало быть I = 1}
- I:= 1;
- {Цикл, пока I <= 49. Так мы сможем обойти весь массив. В нем 50 значений, но 50 значение достигается
- путем увеличения текущего индекса на 1}
- While I <= 49 Do Begin
- {Там, внизу, нам представили функцию F, как она должна работать. Это условие и реализует эту функцию:}
- If B[I] Mod 3 = 0 Then {Если текущий элемент делится на 3 без остатка, то}
- FT1:= B[I] {Результат функции = B[I]}
- Else If B[I] Mod 3 = 1 Then {Если остаток от деления на 3 равен 1, то результат - B[I] в квадрате}
- FT1:= B[I] * B[I]
- Else {Иначе результат - B[I] деленное на 3}
- FT1:= B[I] Div 3;
- {Теперь, после выполнения этого кусочка цикла у нас подсчитан числитель для текущей под-дроби числителя}
- {Дальше, у нас в знаменателе - факториал. Следующий кусок цикла считает факториал}
- If I = 1 Then {Факториал 1 = 1, поэтому...}
- F:= 1 {Результат - 1}
- Else Begin {Иначе}
- F:= 1;
- For II:= 2 To I Do F:= F * II; {перемножаем все числа, начиная с 1 и по число, факториал которого
- нам нужен, и в F получаем результат}
- End;
- {Тут мы подсчитали факториал, который всяко имеет отношение к знаменателю дроби}
- U:= U + FT1 / F; {Можно увеличить сумму числителя}
- {совершенно аналогичные действия производятся для знаменателя, т.е на каждом шаге мы суммируем
- результат вычисления дроби с текущим индексом I равным 2, 4, 6, 8... и.т.п, а в числителе индексы
- 1,3,5,7... и.т.п}
- If B[I + 1] Mod 3 = 0 Then
- FT2:= B[I + 1]
- Else If B[I + 1] Mod 3 = 1 Then
- FT2:= B[I + 1] * B[I + 1]
- Else
- FT2:= B[I + 1] Div 3;
- If I + 1 = 1 Then
- F:= 1
- Else Begin
- F:= 1;
- For II:= 2 To I + 1 Do F:= F * II;
- End;
- D:= D + FT2 / F;
- {переходим к следующей паре элементов массива B}
- I:= I + 2;
- End;
- {После исполнения цикла, у нас подсчитан числитель дроби в перемнной U, и знаменатель - в переменной D}
- R:= U / D; {Делим числитель и знаменатель для получения конечного результата}
- For I:= 1 To 50 Do WriteLn('B[', I, ']=', B[I]); {Выводим все числа масива на экран. С нашими начальными
- данными это будут просто числа по порядку с 1 до 50.}
- WriteLn('R=', R); {и результат выводим.}
- ReadLn;
- End.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement