Отримання знань

дистанційна підтримка освіти школярів


Цикл із передумовою while

  Цикл  це послідовність команд, що може виконуватись більше одного разу.

Блок-схема Алгоритмічна мова Мова С++
  поки <умова>
  пц 
         <серія команд>
  кц  
  while (умова)
  {
      <серія команд>;
   }


Задача Parrot

 

   Капосний папуга навчився висмикувати в дідуся Василя волосся, яке ще залишилось у нього на голові. Почавши з однієї волосини, він щодня збільшував порцію вдвічі.

   Через скільки днів дідусеві не знадобиться гребінець, якщо спочатку в нього було аж N волосин?

   Приклади вхідних і вихідних даних

       Введення: 49                             Введення: 254
       Виведення: 6                             Виведення: 8
    

Розв’язання

  Введемо додаткові змінні:

                day – лічильник днів;

                p – кількість волосин на голові у дідуся поточного дня;

                v – кількість волосин, яку вириватиме папуга.

  Спочатку маємо:

                day= 0 (папуга ще не почав висмикувати волосся);

                p= N (спочатку у дідуся було N волосин);

                v= 1 (почав папуга з однієї волосини).

   До яких пір триватиме знущання над дідусем? Поки у нього на голові є волосся. Тобто, поки поточна кількість волосин p більша нуля (p>0).

   Що трапляється кожного дня?

           ¤ Папуга вириває у дідуся кількість волосин v.

                  p= p-v

           ¤ Кількість волосин v, яку він вириватиме наступного дня, збільшується вдвічі.

                  v= v*2

           ¤ Проходить один день, тобто кількість днів day збільшується на один.

                  day= day+1

              Команду day= day+1 можна записувати ще й day++.

   Отже, остаточно матимемо алгоритм:

         day=0
         p=N
         v=1
         поки p>0
         пц
                 p=p-v
                 v=v*2
                 day= day+1
         кц

   Програма матиме вигляд:

          #include <bits/stdc++.h>

         using namespace std;

         int main(int argc, char** argv) 

         {

             int N, day, p, v;

             cin>>N;

             day=0;

             p=N;

             v=1;

             while (p>0)

             {

                 p=p-v;

                 v=v*2;

                 day++;

              }

             cout<<day;

             return 0;

         }

Таблиця виконання алгоритму


Задача Aliquot_3

  Незнайці дуже подобається цифра 3. Одного разу він вирішив порахувати у придуманому числі N кількість цифр, кратних 3. Будучи невпевненим у правильності своїх обрахунків, бешкетник почав турбувати жителів Квіткового міста з проханням перевірити його результат. Односельці чомусь не зраділи виявам уваги до своїх осіб з боку Незнайки.

  Напишіть програму, яка рахуватиме для названого хлопчиком числа N кількість цифр, кратних 3.

   Приклади вхідних і вихідних даних

        Введення: 123698
        Виведення: 3

        Введення: 1007931
        Виведення: 4

 

Розв’язання

  Число x називають кратним числу y, якщо x ділиться на y без остачі (тобто дає остачу 0).

  У С++, як і в мові Python, операцію, яка знаходить остачу від ділення, позначають %.

  Наприклад

        15%4 = 3 (15 націло поділити на 4 буде 3; 3*4= 12; остача від 15 буде 3)

        24%6= 0 (число 24 націло ділиться на 6, тому остача дорівнює 0).

  Як записати умову, що число N кратне 3? При діленні на 3 воно має давати остачу 0. Тобто N%3==0 - перевірка числа на кратність 3.

  Для того, щоб порахувати кількість кратних цифр у числі, потрібно вміти число “порізати” на цифри.

  Припустимо, що було названо число 238. Як його розділити на цифри 2, 3, 8?

  Спробуємо 238 поділити на 10.

        

  Отримаємо цілу частину від ділення – 23 і остачу – цифру 8 (останню цифру в числі).

  Продовжимо аналогічні міркування для числа 23 (останню цифру ми знайшли, і далі вона нас не цікавить).
       

  Поділивши число 23 на 10, отримаємо цілу частину 2 і остачу 3 (друга цифра числа).
        

  При діленні 2 на 10 матимемо 0 і остачу 2 (третя цифра).

  Від нашого початкового числа 238 залишився 0 (ми його “порізали” на цифри), тому подальші міркування не мають сенсу.

  Підведемо підсумки для деякого числа N.

    1) До яких пір початкове число потрібно ділити на 10?

           Поки воно не перетвориться в нуль (тоді ми знайдемо всі цифри).

           Отже, програма має працювати, поки N>0.

     2) Як знайти останню цифру числа N?

           Потрібно число поділити на 10 і взяти остачу від ділення.

           cifra = N % 10

     3) Як відкинути останню цифру і шукати наступні?

           Потрібно взяти цілу частину від числа і далі працювати з ним.

           N= N/10

  Отже, алгоритм поділу числа на цифри матиме вигляд:

         поки N>0
         пц
                cifra = N % 10
                 N= N/10
         кц

  Залишилось додати до нашого алгоритму перевірку цифр на кратність 3.

  Нехай k – кількість цифр, кратних 3. Початкове значення k= 0 (ми ще не знайшли жодної цифри, що нам підходить). 

  У циклі після знаходження цифри cifra = N % 10 потрібно перевірити її на кратність 3 та додати 1 до кількості, якщо умова виконується.

        k= 0
        поки N>0
        пц
              cifra = N % 10
              якщо cifra%3==0
                        то k= k+1
              все
              N= N/10
        кц

   Програма матиме вигляд:

       #include <bits/stdc++.h>

       using namespace std;

       int main(int argc, char** argv) 

       {

           int N, cifra, k;

           k=0;

           cin>>N;

           while (N>0)

           {

               cifra= N%10;

               if (cifra%3==0)

                     k=k+1;

               N= N/10;

            }

           cout<<k;

           return 0;

       }


В системі: гості - (1); користувачі - (0)