Advertisement
Abaduaber

AnnPol_232

Jan 13th, 2013
372
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Pascal 6.79 KB | None | 0 0
  1. Var
  2.     B: Array [1..50] Of LongInt; R, U, D, F: Double;
  3.     {B - По условию нам даны натуральные числа от b1 до b50. Какие именно - не сказано.
  4.      Вполне разумно, что группу этих натуральных чисел можно представить как одномерный массив,
  5.      поэтому я объявил целочисленный массив B размером в 50 значений.
  6.      R - по условию, в этой переменной должен оказаться результат. Т.к в расчетах будет использоваться
  7.      деление, переменная, как и все остальные, объявлена вещественной, т.е может принимать и не целые значения.
  8.      U и D: Это промежуточные переменные, в U записывается результат вычисления числителя текущей дроби, в D - знаменателя}
  9.      F - промежуточная переменная, принимающая значение результата исполнения функции нахождения факториала.
  10.  
  11.     I, II: Integer;
  12.     {В моих программах, переменные с именами I и II всегда являются индексами для массивов,
  13.      обычно I - это основной индекс, а II - дополнительный, как, например, в предыдущей задаче.
  14.     По этим переменным крутятся циклы For.}
  15.     FT1, FT2: LongInt;
  16.     {FT1 и FT2 - промежуточные переменные, в них помещается результат вычисления функции F(B(i)) на каждой
  17.      итерации. Функции исполняются как в числителе, так и в знаменателе, поэтому этих переменных две штуки.}
  18.  
  19. Begin
  20.     {Из условия задачи не известно, какие натуральные числа нам даны. Можно было сделать, чтобы они
  21.      вводились с клавиатуры, но я решил просто задать их значения по порядку, с 1 до 50, что цикл снизу
  22.      и делает.}
  23.     For I:= 1 To 50 Do B[I]:= I;
  24.     {Теперь смотрим. В этой огромной дроби наша задача - посчитать числитель со знаменателем, потом только
  25.      поделить. В числителе и знаменателе также присутствуют дроби, которые придется считать отдельно.
  26.      При этом, как в числителе, так и в знаменателе требуется подсчитать сумму этих дробей по заданному
  27.      правилу. Потребуется цикл. В данном варианте мы будем увеличивать текущий индекс не на 1, а сразу на 2,
  28.      поэтому потребуется использовать цикл While, а не For
  29.      Начнем с первого элемента последовательности, стало быть I = 1}
  30.     I:= 1;
  31.     {Цикл, пока I <= 49. Так мы сможем обойти весь массив. В нем 50 значений, но 50 значение достигается
  32.      путем увеличения текущего индекса на 1}
  33.     While I <= 49 Do Begin
  34.       {Там, внизу, нам представили функцию F, как она должна работать. Это условие и реализует эту функцию:}
  35.       If B[I] Mod 3 = 0 Then {Если текущий элемент делится на 3 без остатка, то}
  36.         FT1:= B[I]  {Результат функции = B[I]}
  37.       Else If B[I] Mod 3 = 1 Then {Если остаток от деления на 3 равен 1, то результат - B[I] в квадрате}
  38.         FT1:= B[I] * B[I]
  39.       Else {Иначе результат - B[I] деленное на 3}
  40.         FT1:= B[I] Div 3;
  41.       {Теперь, после выполнения этого кусочка цикла у нас подсчитан числитель для текущей под-дроби числителя}
  42.  
  43.       {Дальше, у нас в знаменателе - факториал. Следующий кусок цикла считает факториал}
  44.       If I = 1 Then {Факториал 1 = 1, поэтому...}
  45.         F:= 1 {Результат - 1}
  46.       Else Begin {Иначе}
  47.         F:= 1;
  48.         For II:= 2 To I Do F:= F * II; {перемножаем все числа, начиная с 1 и по число, факториал которого
  49.         нам нужен, и в F получаем результат}
  50.       End;
  51.       {Тут мы подсчитали факториал, который всяко имеет отношение к знаменателю дроби}
  52.  
  53.       U:= U + FT1 / F; {Можно увеличить сумму числителя}
  54.  
  55.       {совершенно аналогичные действия производятся для знаменателя, т.е на каждом шаге мы суммируем
  56.        результат вычисления дроби с текущим индексом I равным 2, 4, 6, 8... и.т.п, а в числителе индексы
  57.        1,3,5,7... и.т.п}
  58.       If B[I + 1] Mod 3 = 0 Then
  59.         FT2:= B[I + 1]
  60.       Else If B[I + 1] Mod 3 = 1 Then
  61.         FT2:= B[I + 1] * B[I + 1]
  62.       Else
  63.         FT2:= B[I + 1] Div 3;
  64.  
  65.       If I + 1 = 1 Then
  66.         F:= 1
  67.       Else Begin
  68.         F:= 1;
  69.         For II:= 2 To I + 1 Do F:= F * II;
  70.       End;
  71.  
  72.       D:= D + FT2 / F;
  73.       {переходим к следующей паре элементов массива B}
  74.       I:= I + 2;
  75.     End;
  76.     {После исполнения цикла, у нас подсчитан числитель дроби в перемнной U, и знаменатель - в переменной D}
  77.     R:= U / D; {Делим числитель и знаменатель для получения конечного результата}
  78.     For I:= 1 To 50 Do WriteLn('B[', I, ']=', B[I]); {Выводим все числа масива на экран. С нашими начальными
  79.     данными это будут просто числа по порядку с 1 до 50.}
  80.     WriteLn('R=', R); {и результат выводим.}
  81.     ReadLn;
  82. End.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement