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

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

Цикл While. Блок 3. Анализ цифр числа.

Задача A. Сумма цифр числа
Дано натуральное число N. Напишите функцию int SumOfDigits (int n), вычисляющую сумму цифр числа N.

  1. int SumOfDigits (int n)
  2. {
  3.   int sum = 0;
  4.   while (n)
  5.   {
  6.     sum += n % 10;
  7.     n /= 10;
  8.   }
  9.   return sum;
  10. }
* This source code was highlighted with Source Code Highlighter.


Задача B. Количество нулей
Дано натуральное число N. Напишите функцию int NumberOfZeroes(int n), определяющую количество нулей среди всех цифр числа N.

  1. int NumberOfZeroes(int n)
  2. {
  3.   int count = 0;
  4.   while (n)
  5.   {
  6.     if (n % 10 == 0)
  7.       count++;
  8.     n /= 10;
  9.   }
  10.   return count;
  11. }
* This source code was highlighted with Source Code Highlighter.


Задача C. Минимальная и максимальная цифры
Дано натуральное число N. Напишите функцию int MinDigit (int n)  и int MaxDigit (int n), определяющие наименьшую и наибольшую цифры данного числа.
Необходимо вывести наименьшую и наибольшую цифры данного числа через пробел.

  1. int MinDigit (int n)
  2. {
  3.   int cur;
  4.   int min_n = 9;
  5.   while (n)
  6.   {
  7.     cur = n % 10;
  8.     min_n = min(min_n,cur);
  9.     n /= 10;
  10.   }
  11.   return min_n;
  12. }
  13. int MaxDigit (int n)
  14. {
  15.   int cur;
  16.   int max_n = 0;
  17.   while (n)
  18.   {
  19.     cur = n % 10;
  20.     max_n = max(max_n,cur);
  21.     n /= 10;
  22.   }
  23.   return max_n;
  24. }
* This source code was highlighted with Source Code Highlighter.


Задача D. Двоичная запись
Дано натуральное число N. Выведите его представление в двоичном виде в обратном порядке.

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


Задача E. Обращение числа
Напишите функцию int reverse(int n), которая переставляет цифры числа в обратном порядке .

Вариант 1. Если перевернутое число не требуется оформлять как отдельную переменную, то можно, просто откусывая последние цифры исходного числа, выписывать их в строку вывода .

  1. int reverse(int n)
  2. {
  3.   do
  4.   {
  5.     cout << n % 10;
  6.     n /= 10;
  7.   }
  8.   while (n);
  9.   return 0;
  10. }
* This source code was highlighted with Source Code Highlighter.

Вариант 2. Но можно и завести отдельную переменную под перевертыш, тогда появится возможность при необходимости использовать результат в дальнейшем.

  1. int reverse(int n)
  2. {
  3.   int rev = 0;
  4.   do
  5.   {
  6.     rev = rev * 10 + n % 10;
  7.     n /= 10;
  8.   }
  9.   while (n);
  10.   return rev;
  11. }
* This source code was highlighted with Source Code Highlighter.


Задача F. Количество палиндромов
Назовем число палиндромом, если оно не меняется при перестановке его цифр в обратном порядке. Напишите функцию bool IsPalindrome (int n), проверяющую по данному числу n, является ли оно палиндромом.
Напишите программу, которая по заданному числу K выводит количество натуральных палиндромов, не превосходящих K.

  1. bool IsPalindrome (int cur)
  2. {
  3.   int base = cur;
  4.   int rev = 0;
  5.   while (cur)
  6.   {
  7.     rev = rev * 10 + cur % 10;
  8.     cur /= 10;
  9.   }
  10.   if (base == rev)
  11.     return true;
  12.   else
  13.     return false;
  14. }
  15. int main()
  16. {
  17.   freopen("input.txt","r",stdin);
  18.   freopen("output.txt","w",stdout);
  19.  
  20.  int n;
  21.   cin >> n;
  22.   int cur = 1, count = 0;
  23.  
  24.   while (cur <= n)
  25.   {
  26.     if (IsPalindrome (cur))
  27.       count++;
  28.     cur++;
  29.   }
  30.   cout << count;
* This source code was highlighted with Source Code Highlighter.

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

Цикл 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.

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

Цикл While. Блок 1. Задачи на цикл While.

Задача A. Список квадратов
Выведите все точные квадраты натуральных чисел, не превосходящие данного числа N.

  1.   int n;
  2.   cin>>n;
  3.   int value = 1;
  4.   int curSqr = value*value;
  5.   while (curSqr<=n)
  6.   {
  7.     cout<<curSqr<<' ';
  8.     value++;
  9.     curSqr = value*value;
  10.   }
* This source code was highlighted with Source Code Highlighter.


Задача B. Минимальный делитель
Дано целое число, не меньшее 2. Выведите его наименьший натуральный делитель, отличный от 1.

  1.   int n;
  2.   cin >> n;
  3.   int i = 2, min_den = 1;
  4.   int sqrt_n = sqrt((double)n);
  5.   while (i <= sqrt_n)
  6.   {
  7.     if (n % i == 0)
  8.     {
  9.       min_den = i;
  10.       break;
  11.     }
  12.     i++;
  13.   }
  14.   if (min_den == 1)
  15.     cout << n;
  16.   else
  17.     cout << min_den;
* This source code was highlighted with Source Code Highlighter.


Задача C. Список степеней двойки
По данному числу N распечатайте все целые степени двойки, не превосходящие N, в порядке возрастания. Операцией возведения в степень пользоваться нельзя!

Вариант 1.

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

Той же  самой цели можно добиться, заменив явное умножение на 2 побитовым сдвигом.
Вариант 2.

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


Задача D. Точная степень двойки
Дано натуральное число N. Выведите слово YES, если число N является точной степенью двойки, или слово NO в противном случае. Операцией возведения в степень пользоваться нельзя!

  1.   int n;
  2.   cin>>n;
  3.   int bitAmount = 0;
  4.   while (n) {
  5.     bitAmount += n % 2;
  6.     n /= 2;
  7.   }
  8.   if (bitAmount == 1)
  9.     cout<<"YES";
  10.   else
  11.     cout<<"NO";
* This source code was highlighted with Source Code Highlighter.


Задача E. Двоичный логарифм
По данному натуральному числу N выведите такое наименьшее целое число k, что 2k≥N.
Операцией возведения в степень пользоваться нельзя!

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


Задача F. Утренняя пробежка
В первый день спортсмен пробежал x километров, а затем он каждый день увеличивал пробег на 10% от предыдущего значения. По данному числу y определите номер дня, на который пробег спортсмена составит не менее y километров.
Программа получает на вход действительные числа x и y и должна вывести одно натуральное число.

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


Задача G. Банковские проценты
Вклад в банке составляет x рублей. Ежегодно он увеличивается на p процентов, после чего дробная часть копеек отбрасывается. Каждый год сумма вклада становится больше. Определите, через сколько лет вклад составит не менее y рублей.
Программа получает на вход три натуральных числа: x, p, y и должна вывести одно целое число.

  1.   double x,p,y;
  2.   int years = 0;
  3.   cin>>x>>p>>y;
  4.   while (x<y) {
  5.     x *= (1 + p/100.0);
  6.     x *= 100;
  7.     x = (int) x;
  8.     x /= 100;
  9.     years++;
  10.   }
  11.   cout<<years;
* This source code was highlighted with Source Code Highlighter.


Задача H. Числа Фибоначчи
Последовательность Фибоначчи определяется так: φ0=0,  φ1=1, ..., φn=φn-1+φn-2.
По данному числу n определите n-е число Фибоначчи φn.

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


Задача I. Номер числа Фибоначчи
Дано натуральное число A. Определите, каким по счету числом Фибоначчи оно является, то есть выведите такое число n, что φn=A. Если А не является числом Фибоначчи, выведите число -1.

  1.   int a, i = 1, f1 = 0, f2 = 1, cur = 1;
  2.   cin >> a;
  3.  
  4.   while (cur < a)
  5.   {
  6.     cur = f1 + f2;
  7.     f1 = f2;
  8.     f2 = cur;
  9.     i++;
  10.   }
  11.   if (cur == a)
  12.     cout << i;
  13.   else
  14.     cout << -1;
* This source code was highlighted with Source Code Highlighter.


Задача J. Исполнитель Раздвоитель
Исполнитель “Раздвоитель” преобразует натуральные числа. У него есть две команды: “Вычесть 1” и “Разделить на 2”, первая команда уменьшает число на 1, вторая команда уменьшает число в два раза, если оно чётное, иначе происходит ошибка.
Дано два натуральных числа A и B (A>B). Напишите алгоритм для Раздвоителя, который преобразует число A в число B и при этом содержит минимальное число команд. Команды алгоритма нужно выводить по одной в строке, первая команда обозначается, как -1, вторая команда как :2.

  1.   int a, b;
  2.   cin >> a >> b;
  3.  
  4.   while (a > b)
  5.   {
  6.     if (a % 2 == 0 && a / 2 >= b)
  7.     {
  8.       cout << ":2" << endl;
  9.         a /= 2;
  10.     }
  11.     else
  12.     {
  13.       cout << -1 << endl;
  14.       a--;
  15.     }
  16.   }
* This source code was highlighted with Source Code Highlighter.


Задача K. Исполнитель Водолей
У исполнителя “Водолей” есть два сосуда, первый объемом A литров, второй объемом B литров, а также кран с водой. Водолей может выполнять следующие операции:
Наполнить сосуд A (обозначается >A).
Наполнить сосуд B (обозначается >B).
Вылить воду из сосуда A (обозначается A>).
Вылить воду из сосуда B (обозначается B>).
Перелить воду из сосуда A в сосуд B (обозначается как A>B).
Перелить воду из сосуда B в сосуд A (обозначается как B>A).
Команда переливания из одного сосуда в другой приводят к тому, что либо первый сосуд полностью опустошается, либо второй сосуд полностью наполняется.
Программа получает на вход три натуральных числа A, B, N, не превосходящих 104 Вам необходимо вывести алгоритм действий Водолея, который позволяет получить в точности N литров в одном из сосудов, если же такого алгоритма не существует, то программа должна вывести текст Impossible. Количество операций в алгоритме не должно превышать 105. Гарантируется, что если задача имеет решение, то есть решение, которое содержит не более, чем 105 операций.

  1.   const int LIMIT = 1e5 + 10;
  2.   int a, b, n;
  3.   cin >> a >> b >> n;
  4.   char min = 'A', max = 'B';
  5.   bool real = false;
  6.   if (b < a)
  7.   {
  8.     swap(a, b);
  9.     swap(min, max);
  10.   }
  11.   int bV = 0, aV = 0;
  12.  
  13.   int k = 0;
  14.   do
  15.   {
  16.     k++; /*printf(">%c\n",min);*/       
  17.     k++; /*printf("%c>%c\n", min, max);*/   
  18.     if (b - bV >= a)
  19.       bV += a;
  20.     else
  21.     {
  22.       bV = a - (b - bV);
  23.       k++; /*printf("%c>\n",max);*/    
  24.       k++; /*printf("%c>%c\n", min, max);*/ 
  25.     }
  26.     if (n == bV)
  27.     {
  28.       real = true;
  29.       break;
  30.     }
  31.   }
  32.   while(k <= LIMIT);
  33.  
  34.   if (real)
  35.   {
  36.     bV = 0;
  37.     do
  38.     {
  39.       printf(">%c\n",min);       
  40.       printf("%c>%c\n", min, max);   
  41.       if (b - bV >= a)
  42.         bV += a;
  43.       else
  44.       {
  45.         bV = a - (b - bV);
  46.         printf("%c>\n",max);     
  47.         printf("%c>%c\n", min, max); 
  48.       }
  49.       if (n == bV)
  50.         break;
  51.     }
  52.     while(true);
  53.   }
  54.   else
  55.     cout<<"Impossible";
* This source code was highlighted with Source Code Highlighter.

понедельник, 14 февраля 2011 г.

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

Цикл For. Блок 2. Задачи на цикл For.

Задача A. Четные числа
Выведите (через пробел) все четные числа от a до b (включительно).

  1. int a, b ;
  2. cin >> a >> b;
  3.  
  4. for (int i = a; i <= b; i++)
  5.   if (i % 2 == 0)
  6.     cout << i << ' ';
* This source code was highlighted with Source Code Highlighter.


Задача B. Остаток
Вводятся 4 числа: a, b, c и d.
Выведите все числа на отрезке от a до b, дающие остаток c при делении на d.

  1.   int a, b, c, d ;
  2.   cin >> a >> b >> c >> d;
  3.   for (int i = a ; i <= b ; i++)
  4.     if (i % d == c)
  5.       cout << i << ' ';
* This source code was highlighted with Source Code Highlighter.


Задача C. Квадраты
Выведите все числа на отрезке от a до b, являющиеся полными квадратами.

Вариант 1.

  1.   int a , b;
  2.   cin >> a >> b ;
  3.   int sqrt_a = ceil(sqrt(a + 0.0));
  4.   int sqrt_b = sqrt((double)b);
  5.   for (int i = sqrt_a ; i <= sqrt_b ; i++)
  6.       cout << i*i << " ";

* This source code was highlighted with Source Code Highlighter.

В этом случае мы рационально движемся от sqrt(a) к sqrt(b), т.к. проверка меньших и больших значений смысла не имеет.
Нужно обратить внимание, что корень от а округляется в большую сторону ceil(sqrt(a + 0.0) перед отправкой в цикл: если а – и есть полный квадрат, то это число также должно быть выведено, однако, если а дает дробный корень, то его целая часть (при приведении к типу int) даст заведомо меньший квадрат, чем значение а. Поэтому мы заранее округляем sqrt(a) до следующего целого числа, дабы избежать выведение лишнего квадрата.

Варинат 2. 
Этот вариант реализации менее рациональный, однако более прозрачный. Мы напрямую движемся от а до b c проверкой полноты квадрата каждого из текущих значений.

  1.  int a,b;
  2.   cin>>a>>b;
  3.   for (int i=a;i<=b;i++)
  4.   {
  5.     int Sqrt = sqrt((double)i);
  6.     if ( Sqrt*Sqrt == i)
  7.       cout<<i<<' ';
  8.   }
* This source code was highlighted with Source Code Highlighter.


Задача H. Делители числа
Выведите все натуральные делители числа x в порядке возрастания (включая 1 и само число).

  1.   int x;
  2.   cin >> x;
  3.  
  4.   for (int i = 1 ; i <= x ; i++)
  5.     if ( x % i == 0 )
  6.       cout << i << ' ';
* This source code was highlighted with Source Code Highlighter.


Задача I. Количество делителей
Подсчитайте количество натуральных делителей числа x (включая 1 и само число; x <= 30000).

  1.   int x, k = 0;
  2.   cin >> x;
  3.  
  4.   for (int i = 1; i <= x; i++)
  5.     if (x % i == 0 )
  6.       k++;
  7.   cout << k;
* This source code was highlighted with Source Code Highlighter.


Задача J. Сумма ста
Вычислите сумму данных 100 натуральных чисел. Вводятся 100 чисел, сумму которых необходимо посчитать.

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


Задача K. Сумма чисел
Вычислите сумму данных N натуральных чисел. Вводится число N, а затем N чисел, сумму которых необходимо вычислить.

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


Задача M. Нули
Вводится число N, а затем N чисел. Подсчитайте, сколько среди данных N чисел нулей.

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


Задача N. Подсчет чисел
Подсчитайте, сколько среди данных N чисел нулей, положительных чисел, отрицательных чисел. Вводится число N, а затем N чисел. Необходимо вывести сначала число нулей, затем число положительных и отрицательных чисел.

Вариант 1.

  1.   int n, x;
  2.   int zero = 0, pos = 0, neg = 0;
  3.   cin >> n;
  4.  
  5.   for (int i = 1; i <= n ; i++)
  6.   {
  7.     cin >> x;
  8.     if (x == 0)   zero++;
  9.     else if (x > 0) pos++;
  10.     else      neg++;
  11.   }
  12.   cout<<zero<<' '<<pos<<' '<<neg;
* This source code was highlighted with Source Code Highlighter.

При данной реализации мы каждый раз в цикле прогоняем последовательную проверку числа на знак. Сейчас это не доставляет никаких неудобств, т.к. мы имеем всего 3 критерия подсчета. Однако, если б требовалась более широкая проверка, например, относительно 10-ти различных случаев, то рациональнее было бы использовать сase–структуру. Что и сделано в варианте 2

Вариант 2.
Используем сase–структуру для определения знака, предварительно нормировав ненулевые значения в единицу (1/-1).

  1.   int n, x;
  2.   int zero = 0, pos = 0, neg = 0;
  3.   cin >> n;
  4.  
  5.   for (int i = 1; i <= n ; i++)
  6.   {
  7.     cin >> x;
  8.    
  9.     if (x)
  10.       x /= abs(x);
  11.     switch(x)
  12.     {
  13.     case 1: pos++; break;
  14.     case 0: zero++; break;
  15.     case -1: neg++; break;
  16.     }
  17.   }
  18.   cout<<zero<<' '<<pos<<' '<<neg;
* This source code was highlighted with Source Code Highlighter.


Задача O. Ноль или не ноль
Проверьте, есть ли среди данных N чисел нули. Вводится число N, а затем N чисел. Выведите YES, если среди введенных чисел есть хотя бы один нуль, или NO в противном случае.

Вариант 1.

  1.   int x, n;
  2.   cin >> n;
  3.   bool zeroExist = false;
  4.  
  5.   for (int i = 1; i <= n ; i++)
  6.   {
  7.     cin >> x;
  8.     if (x == 0)
  9.     {
  10.       zeroExist = true;
  11.       break;
  12.     }
  13.   }
  14.   if (zeroExist)
  15.     cout<<"YES";
  16.   else
  17.     cout << "NO";

This source code was highlighted with Source Code Highlighter.


Вариант 2.
Ту же самую идею можно описать короче.

  1.   int x, n;
  2.   cin >> n;
  3.   bool zeroExist = false;
  4.  
  5.   for (int i = 1; i <= n ; i++)
  6.   {
  7.     cin >> x;
  8.     zeroExist = zeroExist | (x == 0);
  9.     if (zeroExist)
  10.       break;
  11.   }
  12.   cout<<(zeroExist ? "YES" : "NO");
* This source code was highlighted with Source Code Highlighter.


Задача P. Уравнение по возрастанию
Вводятся 4 числа: a, b, c и d.
Найдите все целые решения уравнения ax3 + bx2 + cx + d = 0 на отрезке [0,1000] и выведите их в порядке возрастания.

  1.   long long a , b , c , d ;
  2.   cin >> a >> b >> c >> d;
  3.  
  4.   for (int i = 0; i <= 1000 ; i++)
  5.     if ( a*i*i*i + b*i*i + c*i + d == 0)
  6.       cout<< i <<' ';
* This source code was highlighted with Source Code Highlighter.


Задача Q. Уравнение по убыванию
Вводятся 4 числа: a, b, c и d.
Найдите все целые решения уравнения ax3 + bx2 + cx + d = 0 на отрезке [0,1000] и выведите их в порядке убывания.

  1.   long long a, b, c, d;
  2.   cin >> a >> b >> c >> d;
  3.  
  4.   for (int i = 1000; i >= 0; i--)
  5.     if (a*i*i*i + b*i*i + c*i + d == 0)
  6.       cout << i <<' ';
* This source code was highlighted with Source Code Highlighter.


Задача R. Количество решений
Вводятся 5 чисел: a, b, c, d и e.
Найдите все целые решения уравнения ( ax3 + bx2 + cx + d ) / ( x - e ) = 0 на отрезке [0,1000] и выведите их количество.

  1.   long long a, b, c, d, e;
  2.   cin >> a >> b >> c >> d >> e ;
  3.   int k = 0;
  4.  
  5.   for (int i = 0; i <= 1000; i++ )
  6.     if (a*i*i*i + b*i*i + c*i + d == 0)
  7.       if (i - e != 0)
  8.         k++;
  9.   cout << k ;
* This source code was highlighted with Source Code Highlighter.


Задача S. ГНЧЭ-1
"ГНЧЭ-1"  – сложное электронное устройство, выдающее каждую секунду очередное число последовательности 1, 2, 2, 3, 3, 3, 4, 4, 4, 4, 5... Ввиду дороговизны электронных комплектующих вам поручено разработать эмулятор для этого устройства. 
Дано количество секунд (от 1 до 1000000), которые работает генератор после включения. Вывести результат работы генератора

Вариант 1.
При таком варианте реализации мы печатаем столько раз текущее значение cur сколько оно само обозначает count , после чего обнуляем подсчет одинаковых выводов count и переходим на следующее текущее значение cur и т.д.

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

Вариант 2. 
В этом варианте решения идея та же. Однако контроль за количеством отработанных секунд и количеством напечатанных текущих значений возложены на два отдельных цикла. 
Итак, здесь мы ведем подсчет напечатанных позиций pos , которых должно быть ровно столько же, сколько секунд работает машина. А внутренним циклом задаем печать текущего числа cur . Проверка условия   if (pos == n) не даст задержаться во внутреннем цикле дольше положенных секунд.

  1.   int n;
  2.   cin >> n;
  3.   int pos = 0, cur = 1;
  4.  
  5.   for ( ; pos < n ; )
  6.   {
  7.     for (int i = 0; i < cur; i++)
  8.     {
  9.       printf("%d ", cur);
  10.       pos++;
  11.       if (pos == n)
  12.         break;
  13.     }
  14.     cur++;
  15.   }
* This source code was highlighted with Source Code Highlighter.

воскресенье, 13 февраля 2011 г.

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

Цикл For. Блок 1. Вычисление сумм и произведений.

Задача A. Сумма квадратов
По данному натуральному n вычислите сумму 12+22+...+n2.

  1.   int n, s = 0;
  2.   cin >> n;
  3.   for(int i = 1 ; i <= n ; i++)
  4.     s += i*i;
  5.  
  6.   cout << s;
* This source code was highlighted with Source Code Highlighter.


Задача C. Факториал
Вычислите N! ("эн-факториал") – произведение всех натуральных чисел от 1 до N ( N!=1∙2∙3∙…∙ N ).
N – натуральное, не превосходит 12.

  1.   int n, nf = 1;
  2.   cin >> n;
  3.   for(int i = 2 ; i <= n ; i++)
  4.     nf *= i;
  5.   cout << nf;
* This source code was highlighted with Source Code Highlighter.


Задача D. Степень
Выведите число 2 N. N не превосходит 30.

  1.   const int count = 2;
  2.   int n, rez = 1;
  3.   cin >> n;
  4.   for(int i = 1 ; i <= n ; i++)
  5.     rez *= count;
  6.   cout << rez;

* This source code was highlighted with Source Code Highlighter.

Этот вариант использует циклы и более прозрачен. При чем заведенная константа позволяет вычислять степени любого основания, следует лишь дать другое значение константе count.

Однако, если речь идет конкретно об основании 2, добиться того же эффекта можно проще, не прибегая к циклам, методом побитового сдвига.

  1. int n;
  2.   cin>>n;
  3.   cout<<(1<<n);
* This source code was highlighted with Source Code Highlighter.


Задача E. Число сочетаний
По данным натуральным n и k вычислите значение Cnk = n! / (k!(n-k)!) (число сочетаний из n элементов по k).

  1.   long long n,k;
  2.   cin>>n>>k;
  3.   long long res = 1;
  4.  
  5.   for (int i=1;i<=k;i++)
  6.   {
  7.     res *= (n-k+i);
  8.     res /= i;
  9.   }
  10.   cout<<res; 
* This source code was highlighted with Source Code Highlighter.


Задача G. Геометрическая прогрессия
По данному действительному числу a и натуральному n вычислите сумму 1+a+a2+...+an, не используя формулу суммы геометрической прогрессии. Время работы программы должно быть пропорционально n.

  1.   double a;
  2.   int n;
  3.   cin >> a >> n;
  4.   double sum = 1 , an = 1;
  5.  
  6.   for( int i = 1 ; i <= n ; i++)
  7.   {
  8.     an *= a;
  9.     sum += an;
  10.   }
  11.   printf("%0.8f",sum);
* This source code was highlighted with Source Code Highlighter.


Задача H. Сумма – 1
По данному числу n вычислите сумму 1+1/22+1/32+...+1/n2. Вводится одно число n, не превосходящее 100000.

  1.   int n;
  2.   cin >> n;
  3.   double sum = 0;
  4.  
  5.   for( long long i = 1 ; i <= n ; i++)
  6.     sum += 1.0/(i*i);
  7.  
  8.   printf("%0.8f",sum);
* This source code was highlighted with Source Code Highlighter.


Задача I. Сумма – 2
По данному числу n вычислите сумму 4(1-1/3+1/5-1/7+...+(-1)n/(2n+1)).  Вводится одно число n, не превосходящее 100000.

  1.   int n;
  2.   cin >> n;
  3.   double sum = 1.0;
  4.  
  5.   int sign = -1;
  6.   for(int i = 1 ; i <= n ; i++) {
  7.     sum += sign / ( 2.0 * i + 1 );
  8.     sign = -sign;
  9.   }
  10.  
  11.   printf("%0.8f", 4 * sum);
* This source code was highlighted with Source Code Highlighter.


Задача J. Сумма степеней
Вычислите 1+2+22+23+…+2N. N – натуральное, не превосходит 30.

  1.   const int osn = 2;
  2.   int n;
  3.   cin >> n;
  4.   int step = 1, sum = 1;
  5.  
  6.   for( int i = 1 ; i <= n ; i++)
  7.   {
  8.     step *= osn;
  9.     sum += step;
  10.   }
  11.   cout << sum;
* This source code was highlighted with Source Code Highlighter.

Такой вариант хорош, если предполагается вычислять степени произвольных оснований. Для этого под основание завели константу, которую при желании можно изменить. В данном случае osn = 2  
Однако, если задача требует лишь конкретное решение для основания 2, то можно поступить проще и воспользоваться побитовым сдвигом, который и даст нам нужный результат.

  1.   int n;
  2.   cin >> n;
  3.   int step = 1, sum = 1;
  4.  
  5.   for( int i = 1 ; i <= n ; i++)
  6.   {
  7.     step <<= 1;
  8.     sum += step;
  9.   }
  10.   cout << sum;
* This source code was highlighted with Source Code Highlighter.


Задача K. 1/0!+1/1!+1/2!+...
По данному натуральному числу N найдите сумму чисел 1+1/1!+1/2!+1/3!+...+1/N!. Количество действий должно быть пропорционально N.

  1.   int n;
  2.   cin >> n;
  3.   int step = 1, sum = 1;
  4.  
  5.   for( int i = 1 ; i <= n ; i++)
  6.   {
  7.     step <<= 1;
  8.     sum += step;
  9.   }
  10.   cout << sum;
* This source code was highlighted with Source Code Highlighter.

воскресенье, 16 января 2011 г.

Условный оператор

Задача A. Максимум из двух чисел
Даны два целых числа, каждое число записано в отдельной строке. Выведите наибольшее из данных чисел.

  1.   int a,b;
  2.   cin>>a>>b;
  3.   if (a>b )
  4.     cout<<a;
  5.   else
  6.     cout<<b;
* This source code was highlighted with Source Code Highlighter.


Задача B. Високосный год
Требуется определить, является ли данный год високосным. (Напомним, что год является високосным, если его номер кратен 4, но не кратен 100, а также если он кратен 400.)

  1.   int y;
  2.   cin>>y;
  3.   if (y%4==0 && y%100!=0 || y%400==0)
  4.     cout<<"YES";
  5.   else
  6.     cout<<"NO";
* This source code was highlighted with Source Code Highlighter.


Задача C. Тестирующая система
В условии одной из задач на этом сайте написано: “Если данное четырехзначное число является симметричным, выведите 1, иначе выведите любое другое целое число”. Для проверки задачи используются заранее подготовленные примеры и правильные ответ на них. Школьнику кажется, что он решил эту задачу, но тестирующая система почему-то не принимает его решение. Школьник думает, что это происходит оттого, что он выводит не то любое другое число, которое записано в правильных ответах.
Напишите программу, которая по ответу, записанному в тестирующей системе и по ответу школьника определяет, верно ли школьник решила задачу. Программа получает на вход два числа: ответ, записанный в тестирующей системе и ответ школьника. Программа должна вывести YES, если школьник дала верный ответ и NO в противном случае.

  1.   int n1,n2;
  2.   cin>>n1>>n2;
  3.   if ((n1!=1 && n2!=1) || (n1==1 && n2==1))
  4.     cout<<"YES";
  5.   else
  6.     cout<<"NO";
* This source code was highlighted with Source Code Highlighter.


Задача D. Знак числа
В математике функция sign(x) (знак числа) определена так:
sign(x) = 1,   если x > 0,
sign(x) = -1, если x < 0,
sign(x) = 0,   если x = 0.
Для данного числа x выведите значение sign(x).

  1.   int n;
  2.   cin>>n;
  3.   if (n>0)cout<<1;
  4.   if (n<0)cout<<-1;
  5.   if (n==0)cout<<0;
* This source code was highlighted with Source Code Highlighter.


Задача E. Какое из чисел больше?
Даны два целых числа, каждое записано в отдельной строке. Программа должна вывести число 1, если первое число больше второго, число 2, если второе больше первого, или число 0, если они равны.

  1.   int n1,n2;
  2.   cin>>n1>>n2;
  3.   if (n1>n2 )cout<<1;
  4.   if (n2>n1 )cout<<2;
  5.   if (n1==n2 )cout<<0;
* This source code was highlighted with Source Code Highlighter.


Задача F. Максимум из трех
Даны три числа, каждое записано в отдельной строке. Выведите наибольшее из данных чисел (программа должна вывести ровно одно целое число).

  1.   int n1,n2,n3;
  2.   cin>>n1>>n2>>n3;
  3.   if (n1<n2)
  4.     n1=n2;
  5.   if (n1<n3)
  6.     n1=n3;
  7.   cout<<n1;
* This source code was highlighted with Source Code Highlighter.


Задача G. Ладья
Требуется определить, бьет ли ладья, стоящая на клетке с указанными координатами (номер строки и номер столбца), фигуру, стоящую на другой указанной клетке. Вводятся четыре числа: координаты ладьи (два числа) и координаты другой фигуры (два числа), каждое число вводится в отдельной строке.

  1.   int x1,y1,x2,y2;
  2.   cin>>x1>>y1>>x2>>y2;
  3.   if (x1==x2 || y1==y2)
  4.     cout<<"YES";
  5.   else
  6.     cout<<"NO";
* This source code was highlighted with Source Code Highlighter.

Задача не требует дополнительных условий, что шахматная доска не может быть больше 8х8, и фигуры не могут находиться в одной клетке.


Задача H. Слон
Требуется определить, бьет ли слон, стоящий на клетке с указанными координатами (номер строки и номер столбца), фигуру, стоящую на другой указанной клетке. Вводятся четыре числа: координаты слона и координаты другой фигуры.

  1.   int x1,y1,x2,y2;
  2.   cin>>x1>>y1>>x2>>y2;
  3.   int dx = x1 - x2;
  4.   int dy = y1 - y2;
  5.   if (dx < 0) dx = -dx;
  6.   if (dy < 0) dy = -dy;
  7.   if (dx == dy)
  8.     cout<<"YES";
  9.   else
  10.     cout<<"NO";
* This source code was highlighted with Source Code Highlighter.

Задача не требует дополнительных условий, что шахматная доска не может быть больше 8х8, и фигуры не могут находиться в одной клетке.


Задача I. Ферзь
Требуется определить, бьет ли ферзь, стоящий на клетке с указанными координатами (номер строки и номер столбца), фигуру, стоящую на другой указанной клетке. Вводятся четыре числа: координаты ферзя и координаты другой фигуры.

  1.   int x1,y1,x2,y2;
  2.   cin>>x1>>y1>>x2>>y2;
  3.   int dx=x1-x2;
  4.   int dy=y1-y2;
  5.   if (dx<0) dx=-dx;
  6.   if (dy<0) dy=-dy;
  7.  
  8.   if(x1==x2 || y1==y2 || dx==dy)
  9.     cout<<"YES";
  10.   else
  11.     cout<<"NO";
* This source code was highlighted with Source Code Highlighter.

Задача не требует дополнительных условий, что шахматная доска не может быть больше 8х8, и фигуры не могут находиться в одной клетке.


Задача J. Король
Поле шахматной доски определяется парой чисел (a, b), каждое от 1 до 8, первое число задает номер столбца, второе – номер строки. Заданы две клетки. Определите, может ли шахматный король попасть с первой клетки на вторую за один ход. 
Даны 4 целых числа от 1 до 8 каждое, первые два задают начальную клетку, вторые два задают конечную клетку. Начальная и конечная клетки не совпадают. Числа записаны в отдельных строках. Программа должна вывести YES, если из первой клетки ходом короля можно попасть во вторую, или NO в противном случае.

  1.   int x1,y1,x2,y2;
  2.   cin>>x1>>y1>>x2>>y2;
  3.   int dx = x1 - x2;
  4.   int dy = y1 - y2;
  5.   if (dx < 0) dx = -dx;
  6.   if (dy < 0) dy = -dy;
  7.  
  8.   if (dx + dy == 1)
  9.     cout<<"YES";
  10.   else
  11.     if (dx + dy == 2 && dx == 1 && dy == 1)
  12.       cout<<"YES";
  13.     else
  14.       cout<<"NO";
* This source code was highlighted with Source Code Highlighter.

Задача не требует дополнительных условий, что шахматная доска не может быть больше 8х8, и фигуры не могут находиться в одной клетке.


Задача K. Конь
Требуется определить, бьет ли конь, стоящий на клетке с указанными координатами (номер строки и номер столбца), фигуру, стоящую на другой указанной клетке. Вводятся четыре числа: координаты коня и координаты другой фигуры.

  1.   int x1,y1,x2,y2;
  2.   cin>>x1>>y1>>x2>>y2;
  3.   int dx = x1 - x2;
  4.   int dy = y1 - y2;
  5.   if (dx < 0) dx = -dx;
  6.   if (dy < 0) dy = -dy;
  7.   if ((dx+dy)==3 && dx!=0 && dy!=0)
  8.     cout<<"YES";
  9.   else
  10.     cout<<"NO";
* This source code was highlighted with Source Code Highlighter.


Задача L. Шоколадка
Требуется определить, можно ли от шоколадки размером n × m долек отломить k долек, если разрешается сделать один разлом по прямой между дольками (то есть разломить шоколадку на два прямоугольника). Вводятся 3 числа: n, m и k; k не равно n × m. Гарантируется, что количество долек в шоколадке не превосходит 30000.

  1.   int n,m,k;
  2.   cin>>n>>m>>k;
  3.   if (k<=m*n &&(k%n==0 || k%m==0))
  4.     cout<<"YES";
  5.   else
  6.     cout<<"NO";
* This source code was highlighted with Source Code Highlighter.


Задача M. Фишки
В каждую крайнюю клетку квадратной доски поставили по фишке. Могло ли оказаться, что выставлено ровно k фишек? (Например, если доска 2 x 2, то выставлено 4 фишки, а если 6 x 6 - то 20).
Вводится одно натуральное число k.

  1.   int k;
  2.   cin>>k;
  3.   if (k%4==0 || k==1)
  4.     cout<<"YES";
  5.   else
  6.     cout<<"NO";
* This source code was highlighted with Source Code Highlighter.


Задача N. Уравнение
Решить в целых числах уравнение ax + b = 0. Вводятся 2 числа: a и b. Необходимо вывести все решения, если их число конечно, “NO” (без кавычек), если решений нет, и “INF” (без кавычек), если решений бесконечно много.

  1.   int a,b;
  2.   cin>>a>>b;
  3.   if (a==0 && b==0)
  4.     cout<<"INF";
  5.   else
  6.     if ( a==0 || b%a!=0)
  7.       cout<<"NO";
  8.     else
  9.       cout<<-b/a;
* This source code was highlighted with Source Code Highlighter.


Задача O. Сложное уравнение
Решить в целых числах уравнение ( ax + b ) : ( cx + d ) = 0. Вводятся 4 числа: a, b, c и d; c и d не равны нулю одновременно. Необходимо вывести все решения, если их число конечно, “NO” (без кавычек), если решений нет, и “INF” (без кавычек), если решений бесконечно много.

  1.   int a,b,c,d;
  2.   cin>>a>>b>>c>>d;
  3.   if (a==0 && b==0)
  4.     cout<<"INF";
  5.   else
  6.     if ( a==0 || b%a!=0 || c*(-b/a)+d==0)
  7.       cout<<"NO";
  8.     else
  9.       cout<<-b/a;
* This source code was highlighted with Source Code Highlighter.


Задача P. Сдача
Товар стоит a руб. b коп. За него заплатили c руб. d коп. Сколько сдачи требуется получить? Вводятся 4 числа: a, b, c и d. Необходимо вывести 2 числа: e и f, число рублей и копеек, соответственно.

  1.   int r1,k1,r2,k2;
  2.   cin>>r1>>k1>>r2>>k2;
  3.  
  4.   int rRes = r2 - r1;
  5.   int kRes = k2 - k1;
  6.   if (kRes < 0)
  7.   {
  8.     kRes += 100;
  9.     rRes--; // rRes = rRes - 1;
  10.   }
  11.   cout<<rRes<<' '<<kRes;
* This source code was highlighted with Source Code Highlighter.


Задача Q. Мороженое
В кафе мороженое продают по три шарика и по пять шариков. Можно ли купить ровно k шариков мороженого?

  1.   int k;
  2.   cin>>k;
  3.   if (k!=1 && k!=2 && k!=4 && k!=7 )
  4.     cout<<"YES";
  5.   else
  6.     cout<<"NO";
* This source code was highlighted with Source Code Highlighter.


Задача R. Котлеты
На сковородку одновременно можно положить k котлет. Каждую котлету нужно с каждой стороны обжаривать m минут непрерывно. За какое наименьшее время удастся поджарить с обеих сторон n котлет? Вводятся 3 числа: k, m и n.

  1.   int res = 0;
  2.   if (n<k) {
  3.     res = 2 * m;
  4.   }
  5.   else {
  6.     res = 2 * n / k * m;
  7.     if (2 * n % k !=0)
  8.       res += m;
  9.   }
  10.   cout<<res;
* This source code was highlighted with Source Code Highlighter.


Задача S. Координатные четверти
Даны координаты двух точек на плоскости, требуется определить, лежат ли они в одной координатной четверти или нет (все координаты отличны от нуля). Вводятся 4 числа: координаты первой точки (x1, y1) и координаты второй точки (x2, y2).

  1.   int x1,y1,x2,y2;
  2.   cin>>x1>>y1>>x2>>y2;
  3.  
  4.   if (x1*x2>0 && y1*y2>0)
  5.     cout<<"YES";
  6.   else
  7.     cout<<"NO";
* This source code was highlighted with Source Code Highlighter.


Задача T. Существует ли треугольник?
Даны три натуральных числа a, b, c, записанные в отдельных строках. Определите, существует ли треугольник с такими сторонами. Если треугольник существует, выведите строку YES, иначе выведите строку NO.

  1.   int a,b,c;
  2.   cin>>a>>b>>c;
  3.  
  4.   if ( b + c > a && c + a > b && b + a > c)
  5.     cout<<"YES";
  6.   else
  7.     cout<<"NO";
* This source code was highlighted with Source Code Highlighter.


Задача U. Количество равных из трех
Даны три целых числа, записанных в отдельных строках. Определите, сколько среди них совпадающих. 
Программа должна вывести одно из чисел: 3 (если все совпадают), 2 (если два совпадают) или 0 (если все числа различны).

  1.   int a,b,c;
  2.   cin>>a>>b>>c;
  3.  
  4.   if (a == b && b == c)
  5.     cout<<3;
  6.   else
  7.     if (a == b || b == c || a == c)
  8.       cout<<2;
  9.     else
  10.       cout<<0;
* This source code was highlighted with Source Code Highlighter.


Задача V. Квадратное уравнение
Найдите все решения квадратного уравнения ax2 + bx + c = 0. 
Вводятся действительные числа a, b, c, a не равно 0. 
Выведите два действительных числа, если уравнение имеет два корня, одно действительное число – при наличии одного корня. При отсутствии действительных корней ничего выводить не нужно.

  1.   double a,b,c;
  2.   cin>>a>>b>>c;
  3.   double d,x1,x2;
  4.   d=b*b-4*a*c;
  5.   if (d>=0)
  6.   {
  7.     x1=(-b+sqrt(d))/(2*a);
  8.     printf("%0.8f\n",x1);
  9.     if (d>0)
  10.     {
  11.       x2=(-b-sqrt(d))/(2*a);
  12.       printf("%0.8f\n",x2);
  13.     }
  14.   }
* This source code was highlighted with Source Code Highlighter.


Задача W. Тип треугольника
Определите тип треугольника (остроугольный, тупоугольный, прямоугольный) с данными сторонами. Даны три натуральных числа – стороны треугольника.
Необходимо вывести одно из слов: rectangular для прямоугольного треугольника, acute для остроугольного треугольника, obtuse для тупоугольного треугольника или impossible, если входные числа не образуют треугольника.

  1.   int a,b,c;
  2.   cin>>a>>b>>c;
  3.  
  4.   if (a>b) swap(a,b);
  5.   if (b>c) swap(b,c);
  6.   if (a>b) swap(a,b);
  7.  
  8.   if ((b+c)>a && (c+a)>b && (b+a)>c)
  9.   {
  10.     if (c*c == a*a + b*b)
  11.       cout<<"rectangular";
  12.     else if (c*c < a*a + b*b)
  13.       cout<<"acute";
  14.     else
  15.       cout<<"obtuse";
  16.   }   
  17.   else
  18.     cout<<"impossible";
* This source code was highlighted with Source Code Highlighter.

Задача X. Коровы
По данному числу n закончите фразу "На лугу пасется..." одним из возможных продолжений: "n коров", "n корова", "n коровы", правильно склоняя слово "корова". 
Дано число n (n<100). Программа должна вывести введенное число n и одно из слов (на латинице): korov, korova или korovy, например, 1 korova, 2 korovy, 5 korov. Между числом и словом должен стоять ровно один пробел.

  1.   int n;
  2.   cin>>n;
  3.  
  4.   if ( n%10==0 || (n%10>=5 && n%10<=9)||(n>=11 && n<=14))
  5.     cout<<n<<" korov";
  6.   else
  7.     if(n%10==1)
  8.       cout<<n<<" korova";
  9.     else
  10.       cout<<n<<" korovy";
* This source code was highlighted with Source Code Highlighter.


Задача Y. Билеты на метро
Билет на одну поездку в метро стоит 15 рублей, билет на 10 поездок стоит 125 рублей, билет на 60 поездок стоит 440 рублей. Пассажир планирует совершить n поездок. Определите, сколько билетов каждого вида он должен приобрести, чтобы суммарное количество оплаченных поездок было не меньше n, а общая стоимость приобретенных билетов – минимальна. 
Дано одно число n - количество поездок. Выведите три целых числа, равные необходимому количеству билетов на 1, на 10, на 60 поездок.

  1.   const int cost1 = 15, cost10 = 125, cost60 = 440;
  2.   int n, k1, k10, k60;
  3.   cin >> n;
  4.   k60 = n / 60;
  5.   n %= 60;
  6.   k10 = n / 10;
  7.   k1 = n % 10;
  8.  
  9.   if (k1 * cost1 > cost10)
  10.   {
  11.     k1 = 0;
  12.     k10++;
  13.   }
  14.   if (k1 * cost1 + k10 * cost10 > cost60)
  15.   {
  16.     k1 = 0;
  17.     k10 = 0;
  18.     k60++;
  19.   }
  20.   cout<<k1<<" "<<k10<<" "<<k60;
* This source code was highlighted with Source Code Highlighter.


Задача Z. Билеты на метро – 2
Билет на одну поездку в метро стоит 15 рублей, билет на 5 поездок стоит 70 рублей, билет на 10 поездок стоит 125 рублей, билет на 20 поездок стоит 230 рублей, билет на 60 поездок стоит 440 рублей. Пассажир планирует совершить n поездок. Определите, сколько билетов каждого вида он должен приобрести, чтобы суммарное количество оплаченных поездок было не меньше n, а общая стоимость приобретенных билетов – минимальна. 
Дано одно число n - количество поездок. Выведите пять целых чисел, равные необходимому количеству билетов на 1, на 5, на 10, на 20, на 60 поездок. Если для какого-то данного n существует несколько способов приобретения билетов одинаковой стоимости, необходимо вывести ту комбинацию билетов, которая дает большее число поездок.

  1.     const int cost1 = 15, cost5 = 70, cost10 = 125, cost20 = 230, cost60 = 440;
  2.   int n, k1, k5, k10, k20, k60;
  3.   cin >> n;
  4.   k60 = n / 60;
  5.   n %= 60;
  6.   k20 = n / 20;
  7.   n %= 20;
  8.   k10 = n / 10;
  9.   n %= 10;
  10.   k5 = n/5;
  11.   k1 = n % 5;
  12.  
  13.   if (k1 * cost1 >= cost5)
  14.   {
  15.     k1 = 0;
  16.     k5++;
  17.   }
  18.   if (k1 * cost1 + k5 * cost5 >= cost10)
  19.   {
  20.     k1 = 0;
  21.     k5 = 0;
  22.     k10++;
  23.   }
  24.   if (k1 * cost1 + k5 * cost5 + k10 * cost10 >= cost20)
  25.   {
  26.     k1 = 0;
  27.     k5 = 0;
  28.     k10 = 0;
  29.     k20++;
  30.   }
  31.   if (k1 * cost1 + k5 * cost5 + k10 * cost10 + k20 * cost20 >= cost60)
  32.   {
  33.     k1 = 0;
  34.     k5 = 0;
  35.     k10 = 0;
  36.     k20 = 0;
  37.     k60++;
  38.   }
  39.   cout<<k1<<" "<<k5<<" "<<k10<<" "<<k20<<" "<<k60;
* This source code was highlighted with Source Code Highlighter.

Задача AA. Координаты соседей
Для клетки с координатами (x, y) в таблице размером M × N выведите координаты ее соседей. Соседними называются клетки, имеющие общую сторону. 
Даны натуральные числа M, N, x, y (1 ≤ x ≤ M ≤ 109, 1 ≤ y ≤ N ≤ 109). В выходной файл выведите пары координат соседей этой клетки в произвольном порядке.

  1.   int m,n,x,y;
  2.   cin>>m>>n>>x>>y;
  3.  
  4.   if (x!=1) cout<<x-1<<" "<<y<<endl;
  5.   if (x!=m) cout<<x+1<<" "<<y<<endl;
  6.   if (y!=1) cout<<x<<" "<<y-1<<endl;
  7.   if (y!=n) cout<<x<<" "<<y+1;
* This source code was highlighted with Source Code Highlighter.


Задача AB. Апельсины бочками
Бизнесмен Василий после прочтения известной книги решил открыть новый бизнес – отгружать апельсины бочками. Партнерам важно знать сколько именно бочек апельсинов отгружается каждый день. Мобильный телефон Василия поддерживает только транслит, поэтому он передает сообщения вида "N bochek" . Например, "3 bochki" или "1 bochka" .
Напишите программу, которая выбирает правильное слово (из "bochka" , "bochek" , "bochki" ) в зависимости от N (0 ≤ N ≤ 1000).

  1.   int n;
  2.   cin>>n;
  3.   cout<<n<<" "<<"boch";
  4.  
  5.   if ( n%10==0 || (n%10>=5 && n%10<=9)||(n%100>=11 && n%100<=14))
  6.     cout<<"ek";
  7.   else
  8.     if(n%10==1)
  9.       cout<<"ka";
  10.     else
  11.       cout<<"ki";
* This source code was highlighted with Source Code Highlighter.


Задача AC. Четные и нечетные числа
Даны три целых числа A, B, C. Определить, есть ли среди них хотя бы одно четное и хотя бы одно нечетное. 
A, B, C не превышают по модулю 10000. Вывести – "YES" или "NO" .

  1.   int a,b,c;
  2.   cin>>a>>b>>c;
  3.  
  4.   a=abs(a);
  5.   b=abs(b);
  6.   c=abs(c);
  7.  
  8.   if ((a%2 != b%2)|| (a%2!= c%2) )
  9.     cout<<"YES";
  10.   else
  11.     cout<<"NO";
* This source code was highlighted with Source Code Highlighter.


Задача AD. Римская система счисления
Дано число X (1  ≤  X  ≤  100). Требуется перевести это число в римскую систему счисления.

  1.   int x;
  2.   cin>>x;
  3.   int x1,x10;
  4.   x1=x%10;
  5.   x10=x/10;
  6.  
  7.   if (x10==1) cout<<"X";
  8.   if (x10==2) cout<<"XX";
  9.   if (x10==3) cout<<"XXX";
  10.   if (x10==4) cout<<"XL";
  11.   if (x10==5) cout<<"L";
  12.   if (x10==6) cout<<"LX";
  13.   if (x10==7) cout<<"LXX";
  14.   if (x10==8) cout<<"LXXX";
  15.   if (x10==9) cout<<"XC";
  16.   if (x10==10) cout<<"C";
  17.  
  18.   if (x1==1) cout<<"I";
  19.   if (x1==2) cout<<"II";
  20.   if (x1==3) cout<<"III";
  21.   if (x1==4) cout<<"IV";
  22.   if (x1==5) cout<<"V";
  23.   if (x1==6) cout<<"VI";
  24.   if (x1==7) cout<<"VII";
  25.   if (x1==8) cout<<"VIII";
  26.   if (x1==9) cout<<"IX";
* This source code was highlighted with Source Code Highlighter.


Задача AE. Упорядочить три числа
Дано три числа, записанный в отдельных строках. Упорядочите их в порядке неубывания. Программа должна считывать три числа a, b, c, затем программа должна менять их значения так, чтобы стали выполнены условия a <= b <= c, затем программа выводит тройку a, b, c.

  1.   int a,b,c,t;
  2.   cin>>a>>b>>c;
  3.  
  4.   if (a>b) swap(a,b);
  5.   if (a>c) swap(a,c);
  6.   if (b>c) swap(b,c);
  7.  
  8.   cout<<a<<" "<<b<<" "<<c;
* This source code was highlighted with Source Code Highlighter.