четвер, 11 січня 2018 р.

Нелінійні алгоритми

Задачі на перебір цифр натурального числа

Описаний нижче стандартний алгоритм дозволяє виконувати будь-які дії з цифрами натурального числа, в незалежності від значності числа.
Число, після використання цього алгоритму, стає рівним 0! Тому рекомендується зберігати вхідне значення числа у іншій змінній.

Приклад 1

Дано натуральне число n. Визначте у ньому кількість та суму цифр.

Результат роботи програми

ВвідВивідПояснення
24564 17Кількість цифр 4, а їх сума 17
152 6Кількість цифр 2, а їх сума 6

Змінні:

Вхідні:
  • n – натуральне число (цілого типу Longint)
Вихідні:
  • k –кількість цифр числа (цілого типу byte).
  • s – сума цифр числа (цілого типу byte)
Проміжні:
  • c – остання цифра числа (цілого типу byte)

Алгоритм

  1. Спочатку потрібно ввести число оператором read(n).
  2. Нам потрібно знайти суму та кількість. Тому встановимо початкове значення змінним k та s, присвоїмо їм 0.
  3. Згадаємо формулу знаходження останньої цифри числа: c:= n mod 10. Ця формула вірна для числа будь-якої значності.
  4. Згадаємо, що після виконання оператору n:=n div 10, від числа відкидається остання цифра.
  5. На цих двох формулах заснований такий алгоритм: обчислюємо останню цифру числа, робимо з нею потрібні дії (знаходимо кількість, суму, найбільшу цифру, і.т.д), потім цифру відкидаємо. Це робимо, поки у введеному числі не залишиться цифр, тобто число стане 0. Ясно, що для такого алгоритму потрібен цикл із після умовою repeat. Докладніше, у цьому циклі будемо виконувати такі дії:
    • оператор c:= n mod 10 обчислює останню цифру числа.;
    • оператор k:=k+1 збільшує лічильник цифр числа;
    • оператор s:=s+c накопичує знайдену цифру у суму;
    • оператор n:=n div 10 відкидає останню цифру числа. Цей оператор дуже важливий, бо він впливає на умову. Якщо його не написати, програма зациклиться.
    • Перевіряється умова n=0 – чи є ще цифри у числі?
      • Якщо умова не вірна, тобто цифри у числі є, то виконується перехід на початок циклу (пункт5).
      • Якщо умова вірна, тобто цифр у числі немає, то цикл завершується і виконується перехід до оператора, що іде після циклу (пункт 6).
  6. Коли цикл закінчиться, тобто будуть видалені всі цифри числа n, виводимо на екран знайдені кількість та суму цифр оператором writeln( k,'  ',s).

Блок–схема програми

Програма

 var n:longint; c,s,k:byte;
begin
 read(n);
 k:=0; s:=0;
 repeat
     c:= n mod 10;
     k:=k+1; s:=s+c;
     n:=n div 10;
 until n=0;
 writeln( k,' ',s);
end.

Трасування програми

Проводячи трасування програми, потрібно обов’язково дивитись текст програми!

ОператорncskПояснення
read(n)2456   Введення числа
k:=0   0Встановлення початкового значення k
s:=0  0 Встановлення початкового значення s
c:= n mod 10 6  Початок циклу. Обчислення останньої цифри числа n=2456
k:=k+1   1Збільшення лічильника цифр
s:=s+c  6 Накопичення цифри у суму
n:=n div 10245   Відкидання останньої цифри
until n=0    Перевірка умови. Умова невірна, тому перехід на початок циклу.
c:= n mod 10 5 Початок циклу. Обчислення останньої цифри числа n=245
k:=k+1   2Збільшення лічильника цифр
s:=s+c  11 Накопичення цифри у суму
n:=n div 1024   Відкидання останньої цифри
until n=0    Перевірка умови. Умова невірна, тому перехід на початок циклу.
c:= n mod 10 4  Початок циклу. Обчислення останньої цифри числа n=24
k:=k+1   3Збільшення лічильника цифр
s:=s+c  15 Накопичення цифри у суму
n:=n div 102   Відкидання останньої цифри
until n=0    Перевірка умови. Умова невірна, тому перехід на початок циклу.
c:= n mod 10 2  Початок циклу. Обчислення останньої цифри числа n=2
k:=k+1   4Збільшення лічильника цифр
s:=s+c  17 Накопичення цифри у суму
n:=n div 100   Відкидання останньої цифри
until n=0    Перевірка умови. Умова вірна, тому цикл завершується, і здійснюється перехід на оператор після циклу.
writeln(k,' ',s)    Виведення знайдених значень на екран

Приклад 2

Дано натуральне число. З’ясуйте, скільки разів у ньому зустрічається перша цифра.
Для розв’язання цієї задачі потрібно два перебори числа: перший перебір знаходить першу цифру числа, а другий перебір підраховує, скільки таких цифр у числі.

Результат роботи програми

ВвідВивідПояснення
54553Перша цифра 5. Таких цифр 3
41Перша цифра 4. Таких цифр 1

Змінні:

Вхідні:
  • n – натуральне число (цілого типу Longint)
Вихідні:
  • k – кількість цифр числа, що дорівнюють першій цифрі (цілого типу byte).
Проміжні:
  • c – остання цифра числа (цілого типу byte)
  • c1 – перша цифра числа (цілого типу byte)
  • – змінна для запам’ятовування вхідного значення числа.

Алгоритм

  1. Спочатку потрібно ввести число оператором read(n).
  2. Потім потрібно знайти значення першої цифри. Для знаходження першої цифри будемо у циклі відкидати останню цифру у числі, поки не залишиться одна цифра. Цей цикл змінить число n, але значення цього числа нам ще буде потрібно для знаходження кількості. Тому перед циклом значення введеного числа потрібно зберегти у іншу змінну оператором x:=n.
  3. Знайдемо першу цифру числа таким чином: перевіримо, якщо у числі n більше одної цифри, то відкинемо останню. Ясно, що це повинен бути цикл while, бо спочатку перевіряємо умову (чи потрібно відкидати цифру), а потім, якщо потрібно, відкидаємо. Докладніше цикл пошуку першої цифри:
    • перевіряється умова n>9;
    • якщо умова вірна, тобто у числі декілька цифр, то відкидається остання цифра оператором n:=n div 10 і виконується перехід на початок циклу (знов на перевірку умови);
    • якщо умова невірна (тобто число складається з одної цифри), то тіло циклу пропускається і він завершується.
  4. Після завершення циклу запам’ятаємо першу цифру, що залишилась у числі n у змінну c1 оператором c1:=n.
  5. Тепер потрібно знайти у числі кількість цифр, що дорівнюють c1. Для цього встановимо початкове значення лічильника оператором k:=0.
  6. Щоб у числі знайти кількість цифр, що дорівнюють c1, будемо використовувати алгоритм, що описаний у прикладі 1. Але вхідне число змінилося, тому будемо використовувати його копію у змінній x.
  7. Тобто у циклі будемо виконувати такі дії:
    • оператор c:= x mod 10 обчислює останню цифру числа x;
    • оператор if c=c1 перевіряє, чи збігається ця цифра з першою цифрою числа;
    • якщо так, то оператор k:=k+1 збільшує лічильник таких цифр;
    • оператор x:=x div 10 відкидає останню цифру числа x;
    • перевіряється умова x=0 – чиє ще цифри у числі?
      • Якщо умова не вірна, тобто цифри у числі є, то виконується перехід на початок циклу (пункт 7).
      • Якщо умова вірна, тобто цифр у числі немає, то цикл завершується і виконується перехід на оператор, що іде після циклу (пункт 8).
  8. Коли цикл закінчиться, тобто будуть видалені всі цифри числа x, виводимо на екран знайдену кількість оператором writeln(k).

Програма

 var n, x:longint; c,c1,k:byte;
begin
 read(n); x:=n;
 while n>9 do
   n:=n div 10;
 c1:=n;
 k:=0;
 repeat
    c:= x mod 10;
    if c=c1 then k:=k+1;
    x:=x div 10;
 until x=0;
 writeln(k);
end.

Приклад 3

Дано натуральне число n. Знайдіть максимальну цифру. Якщо максимальних цифр декілька, то визначте порядковий номер першої з них, якщо цифри рахувати зліва направо.
Для розв’язання цієї задачі потрібно використовувати два алгоритми: перший – перебір цифр числа, а другий – знаходження найбільшої цифри.

Результат роботи програми

ВвідВивідПояснення
45255 2Найбільша цифра 5. Таких цифр 2.
Якщо рахувати цифри зліва направо, то перша з них має порядковий номер 2.

Змінні:

Вхідні:
  • n – натуральне число (цілого типу Longint)
Вихідні:
  • max – найбільша цифра числа n (цілого типу byte).
  • nmax – порядковий номер першої максимальної цифри, якщо рахувати зліва направо (цілого типу byte).
Проміжні:
  • – остання цифра числа (цілого типу byte)
  • k – порядковий номер цифри, якщо рахувати справа наліво (цілого типу byte).

Алгоритм

  1. Спочатку потрібно ввести число оператором read(n).
  2. Встановимо початкове значення лічильника цифр оператором k:=0.
  3. Для знаходження найбільшого або найменшого, потрібно встановити початкове значення змінній, в який це значення буде зберігатися. Для знаходження найбільшого, початкове значення повинно бути найменшим з можливих (для цифр 0), а для знаходження найменшого, початкове значення повинно бути найбільшим з можливих (для цифр 9). Для знаходження найбільшої цифри, встановимо початкове значення найменше можливе, тобто 0, оператором max:=0.
  4. У циклі, що перебирає цифри, будемо виконувати такі дії:
    • оператор c:= n mod 10 обчислює останню цифру числа n;
    • оператор k:=k+1 збільшує лічильник цифр. Число перебирається, починаючи з останньої цифри, тому цей лічильник, вказує порядковий номер цифри, якщо їх рахувати справа наліво.
    • якщо знайдена цифра c>=max, то запам’ятовуємо значення c у змінній max оператором max:=c та запам’ятовуємо порядковий номер k у змінній nmaxоператором nmax:=k;
    • оператор n:=n div 10 відкидає останню цифру числа n.
    • Перевіряється умова n=0 – чиє ще цифри у числі?
      • Якщо умова не вірна, тобто цифри у числі є, то виконується перехід на початок циклу (пункт 4).
      • Якщо умова вірна, тобто цифр у числі немає, то цикл завершується і виконується перехід на оператор, що іде після циклу (пункт 5).
  5. Коли цикл закінчиться, у змінній max буде значення найбільшої цифри, а у змінній nmax її порядковий номер, якщо рахувати цифри у числі справа наліво. Але нам потрібно знайти порядковий номер найбільшої цифри, якщо цифри рахуються зліва направо. Для цього роздивимось приклад:
    36217Число
    54321Порядковий номер цифри, якщо рахувати цифри у числі справа наліво (справа)
    12345Порядковий номер цифри, якщо рахувати цифри у числі зліва направо (зліва)
    Помітимо, що у числі п’ять цифр і сума порядкових номерів кожної цифри, якщо рахувати справа наліво та зліва направо дорівнює 6. Тому:
    (зліва) + (справа) = (кількість цифр у числі) + 1, звідси
    (зліва) = (кількість цифр у числі) + 1 – (справа).
    Якщо для порядкового номера найбільшої цифри при рахуванні справа та зліва використовувати одну і ту ж змінну nmax, то порядковий номер максимальної цифри, якщо рахувати зліва направо буде nmax:=k+1-nmax.
  6. Потім виводимо на екран знайдені значення оператором writeln(max,'  ',nmax).

Програма

 var n:longint; c,max,nmax,k:byte;
begin
 read(n); max:=0;k:=0;
 repeat
    c:= n mod 10;
    k:=k+1;
    if c>=max then
      begin max:=c; nmax:=k; end;
    n:=n div 10;
 until n=0;
 nmax:=k+1-nmax;
 writeln(max,' ',nmax);
end.

Варіанти задач

  1. Дано натуральне число n. Знайдіть кількість цифр 5.
  2. Дано натуральне число n. Знайдіть суму квадратів його цифр.
  3. Дано натуральне число n. Знайдіть середнє арифметичне його цифр.
  4. Дано натуральне число n. Знайдіть добуток його цифр.
  5. Дано натуральне число. Знайти його першу цифру.
  6. Дано натуральне число n. Знайдіть суму його першої та останньої цифр.
  7. Дано натуральне число. Знайти його другу (спочатку) цифру.
  8. Дано натуральне число. Чи є в ньому цифра 3?
  9. Дано натуральне число. З’ясуйте, скільки разів у ньому зустрічається остання цифра.
  10. Дано натуральне число n. З’ясуйте, скільки разів у ньому зустрічається цифра A.
  11. Дано натуральне число n. Чи вірно, що сума його цифр більша за D?
  12. Дано натуральне число n. Чи вірно, що добуток його цифр більше за B?
  13. Дано натуральне число n. Чи є в ньому цифра A?
  14. Дано натуральне число. Чи вірно, що воно починається та закінчується однаковими цифрами?
  15. Дано натуральне число. З’ясуйте, чи є різниця між його максимальною та мінімальною цифрами парним числом.
  16. Дано натуральної число. З’ясуйте, яка цифра розташована у ньому лівіше: максимальна чи мінімальна.
  17. Дано натуральне число. З’ясуйте, скільки разів у ньому зустрічається максимальна цифра.

Немає коментарів:

Дописати коментар