понедельник, 14 марта 2011 г.

Операторы цикла

Цикл While. Блок 2. Обработка последовательностей, индуктивные функции.

Задача A. Длина последовательности
Программа получает на вход последовательность целых неотрицательных чисел, каждое число записано в отдельной строке. Последовательность завершается числом 0, при считывании которого программа должна закончить свою работу и вывести количество членов последовательности (не считая завершающего числа 0).
Числа, следующие за числом 0, считывать не нужно.

  1.   int x, length = -1;
  2.   do
  3.   {
  4.     length++;
  5.     cin>>x;
  6.   }
  7.   while (x);
  8.   cout << length;
* This source code was highlighted with Source Code Highlighter.


Задача B. Сумма последовательности
Определите сумму всех элементов последовательности, завершающейся числом 0.
Числа, следующие за нулем, считывать не нужно.

  1.   int x, sum = 0;
  2.   cin >> x;
  3.   while (x)
  4.   {
  5.     sum += x;
  6.     cin >> x;
  7.   }
  8.   cout << sum;
* This source code was highlighted with Source Code Highlighter.


Задача C. Среднее значение последовательности
Определите среднее значение всех элементов последовательности, завершающейся числом 0.
Числа, следующие за нулем, считывать не нужно.

  1.   int x, sum = 0, length = 0;
  2.   while (cin>>x && x)
  3.   {
  4.     sum += x;
  5.     length++;
  6.   }
  7.   double rms = (double)sum / length;
  8.   printf("%0.15f",rms);
* This source code was highlighted with Source Code Highlighter.


Задача D. Количество четных элементов последовательности
Определите количество четных элементов в последовательности, завершающейся числом 0.
Само число 0, и все, что следует за ним, учитывать не нужно.

  1.   int x, count = 0;
  2.   cin >> x;
  3.   while (x)
  4.   {
  5.     if (!(x & 1))
  6.       count++;
  7.     cin >> x;
  8.   }
  9.   cout << count;
* This source code was highlighted with Source Code Highlighter.


Задача E. Максимум последовательности
Последовательность состоит из натуральных чисел и завершается числом 0. Определите значение наибольшего элемента последовательности.
Числа, следующие за нулем, считывать не нужно.

  1.   int x;
  2.   cin >> x;
  3.   int Max = x;
  4.   while (x)
  5.   {
  6.     Max = max(Max,x);
  7.     cin >> x;    
  8.   }
  9.   cout << Max;
* This source code was highlighted with Source Code Highlighter.


Задача F. Количество элементов, которые больше предыдущего
Последовательность состоит из натуральных чисел и завершается числом 0. Определите, сколько элементов этой последовательности больше предыдущего элемента.
Числа, следующие за числом 0, считывать не нужно.

  1.   int prv, cur;
  2.   cin >> cur;
  3.   int count = 0;
  4.   while (cur)
  5.   {
  6.     prv = cur;
  7.     cin >> cur; 
  8.     if (cur > prv)
  9.       count++;
  10.   }
  11.   cout << count;
* This source code was highlighted with Source Code Highlighter.


Задача G. Второй максимум
Последовательность состоит из различных натуральных чисел и завершается числом 0. Определите значение второго по величине элемента в этой последовательности.
Числа, следующие за числом 0, считывать не нужно.

  1.   int x;
  2.   cin >> x;
  3.   int max1 = x, max2 = -1;
  4.   while (x)
  5.   {
  6.     cin >> x;
  7.     if (x > max1)
  8.     {
  9.       max2 = max1;
  10.       max1 = x;
  11.     }
  12.     else if ( x > max2 )
  13.       max2 = x;
  14.   }
  15.   cout << max2;
* This source code was highlighted with Source Code Highlighter.


Задача H. Второй максимум – 2
Последовательность состоит из натуральных чисел и завершается числом 0. Определите значение второго по величине элемента в этой последовательности, то есть элемента, который будет наибольшим, если из последовательности удалить наибольший элемент.
Числа, следующие за числом 0, считывать не нужно.

  1.   int x;
  2.   cin >> x;
  3.   int max1 = x, max2 = -1;
  4.   while (x)
  5.   {
  6.     cin >> x;
  7.     if (x > max1)
  8.     {
  9.       max2 = max1;
  10.       max1 = x;
  11.     }
  12.     else if ( x > max2 )
  13.       max2 = x;
  14.   }
  15.   cout << max2;
* This source code was highlighted with Source Code Highlighter.


Задача I. Количество элементов, равных максимуму
Последовательность состоит из натуральных чисел и завершается числом 0. Определите, какое количество элементов этой последовательности, равны ее наибольшему элементу.
Числа, следующие за числом 0, считывать не нужно.

  1.   int x, count = 0;
  2.   cin >> x;
  3.   int max = x;
  4.   while (x)
  5.   {
  6.     if (x > max)
  7.     {
  8.       max = x;
  9.       count = 1;
  10.     }
  11.     else
  12.       if (x == max)
  13.         count++;
  14.     cin >> x;    
  15.   }
  16.   cout << count;
* This source code was highlighted with Source Code Highlighter.


Задача J. Сумма последовательности – 2
Найдите сумму последовательности натуральных чисел, если признаком окончания конца последовательности является два подряд идущих числа 0.
Числа, следующие после двух подряд идущих нулей считывать не нужно.

  1.   int x;
  2.   cin >> x;
  3.   int sum = 0;
  4.   if (x == 0)
  5.     cin >> x;
  6.   while (x)
  7.   {
  8.     sum += x;
  9.     cin >> x;
  10.     if (x == 0)
  11.       cin >> x;
  12.   }
  13.   cout << sum;
* This source code was highlighted with Source Code Highlighter.


Задача K. Максимальное число идущих подряд равных элементов
Дана последовательность натуральных чисел, завершающаяся числом 0. Определите, какое наибольшее число подряд идущих элементов этой последовательности равны друг другу.
Числа, следующие за числом 0, считывать не нужно.

  1.   int cur;
  2.   cin >> cur;
  3.   int base = cur, count = 0, count_max = 0;
  4.   while (cur)
  5.   {
  6.     if (base == cur)
  7.       count++;
  8.     else
  9.     {
  10.       base = cur;
  11.       count = 1;
  12.     }
  13.     count_max = max(count_max, count);
  14.     cin >> cur;
  15.   }
  16.   cout << count_max;
* This source code was highlighted with Source Code Highlighter.


Задача L. Максимальная длина монотонного фрагмента
Дана последовательность натуральных чисел, завершающаяся число 0. Определите наибольшую длину монотонного фрагмента последовательности (то есть такого фрагмента, где все элементы либо больше предыдущего, либо меньше).
Числа, следующие за числом 0, считывать не нужно.

  1.   int prv, cur;
  2.   cin >> prv;
  3.   if (prv)
  4.   {
  5.     cin >> cur;
  6.     int count = 1, count_max = 1;
  7.     int sgn_prv = cur - prv, sgn_cur;
  8.  
  9.     while (cur)
  10.     {
  11.       sgn_cur = cur - prv;
  12.       if (sgn_prv * sgn_cur > 0)
  13.         count++;
  14.       else
  15.         if (sgn_prv * sgn_cur == 0)
  16.           count = 1;
  17.         else
  18.           count = 2;
  19.       count_max = max(count_max, count);
  20.       sgn_prv = sgn_cur;
  21.       prv = cur;
  22.       cin >> cur;
  23.     }
  24.     cout << count_max;
  25.   }
  26.   else
  27.     cout << 0;
* This source code was highlighted with Source Code Highlighter.


Задача M. Количество локальных максимумов
Элемент последовательности называется локальным максимумом, если он строго больше предыдущего и последующего элемента последовательности. Первый и последний элемент последовательности не являются локальными максимумами.
Дана последовательность натуральных чисел, завершающаяся числом 0. Определите количество строгих локальных максимумов в этой последовательности.
Числа, следующие за числом 0, считывать не нужно.

  1.   int prv, cur, nxt;
  2.   int count = 0;
  3.   if (cin>>prv && prv)
  4.   {
  5.     if (cin >> cur && cur)
  6.     {
  7.       if (cin >> nxt)
  8.       {
  9.         while (nxt)
  10.         {
  11.           if ((prv < cur) && (cur > nxt))
  12.             count++;
  13.           prv = cur;
  14.           cur = nxt;
  15.           cin >> nxt;
  16.         }
  17.       }
  18.     }
  19.   }
  20.   cout << count;
* This source code was highlighted with Source Code Highlighter.


Задача N. Наименьшее расстояние между локальными максимумами
Определите наименьшее расстояние между двумя локальными максимумами последовательности натуральных чисел, завершающейся числом 0. Если в последовательности нет двух локальных максимумов, выведите число 0.

  1.   int prv, cur, nxt, pos = 0, prv_max = 0, min_len = 0, cur_len;
  2.   int count = 0;
  3.   if (cin>>prv && prv)
  4.   {
  5.     if (cin >> cur && cur)
  6.     {
  7.       if (cin >> nxt)
  8.       {
  9.         pos = 2;
  10.         while (nxt)
  11.         {
  12.           if ((prv < cur) && (cur > nxt))
  13.           {
  14.             if (prv_max != 0 )
  15.             {
  16.               cur_len = pos - prv_max;
  17.               if (min_len == 0)
  18.                 min_len = cur_len;
  19.               else
  20.                 min_len = min(min_len,cur_len);
  21.             }
  22.             prv_max = pos;
  23.           }
  24.           prv = cur;
  25.           cur = nxt;
  26.           cin >> nxt;
  27.           pos++;
  28.  
  29.         }
  30.       }
  31.     }
  32.   }
  33.   cout<<min_len;
* This source code was highlighted with Source Code Highlighter.


Задача O. Стандартное отклонение

Дана последовательность натуральных чисел x1, x2, ..., xn. Стандартным отклонением называется величина
1
где2 —среднее арифметическое последовательности.

Определите среднеквадратичное отклонение для данной последовательности натуральных чисел, завершающейся числом 0.

  1.   int x;
  2.   cin >> x;
  3.   int  sum_x = 0, sum_x2 = 0, n = 0;
  4.   double s, res;
  5.   if(x)
  6.   {
  7.     while (x)
  8.     {
  9.       sum_x += x;
  10.       sum_x2 += x*x;
  11.       n++;
  12.       cin >> x;
  13.     }
  14.     s = (double)sum_x / n;
  15.     if (n != 1)
  16.     {
  17.       res = sqrt((sum_x2 - 2 * s * sum_x + n * s * s) / (n - 1));
  18.       printf("%0.11f", res);
  19.     }
  20.     else
  21.       cout << 0;
  22.   }
* This source code was highlighted with Source Code Highlighter.

1 комментарий:

  1. res = sqrt((sum_x2 - 2 * s * sum_x + n * s * s) / (n - 1));
    Я не пойму почему n * s * s не работает без n? почему 3 елемент надо жомножьіть на общее количество? если етого не сделать то результат отрицательньій

    ОтветитьУдалить