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

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

Цикл 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, ..., φnn-1n-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.

Комментариев нет:

Отправить комментарий