У гостьовій книзі користувач роман попросив розв’язати кілька простих задач для свого сина. Я вирішив допомогти йому і заодно створити тему, де хтось буде писати умову цікавої задачі шкільного рівня, а інші будуть пропонувати розв’язки цієї задачі. І ми разом серед кількох варіантів розв’язку вибиратимемо найоптимальніший, методично правильний. Тема досить актуальна і цікава. Сподіваюсь, допоможе вчителям, які з різних причин погано знаються на задачах з програмування навіть шкільного рівня (наприклад вчитель, який інформатику читає не за спеціальністю).
Отож, задачі з гостьової книги: Задача 1. Дано натуральне число N (1000 < =N<=9999). Визначити, чи є числo поліндромом, тобто таким числом, яке зліва направо і справа наліво читається однаково (всі чотири цифри враховуються; наприклад, 0110). Задача 2. Василина Премудра грала в шашки зі змієм Гориничем на дуже великій дошці. Спочатку Василина з’їла у Горинича 3 шашки, а Горинич у Василини – 5 шашок, потім Василина у Горинича з’їла 9 шашок, а Горинич у Василини – 10 шашок, на третьому ході Василина проковтнула 15 шашок, а Горинич- 20. Ця серйозна гра тривала ще довго, аж поки Горинич не втомився і після N-го ходу не з’їв саму Василину. Скільки всього шашок проковтнув Змій Горинич? Кількість шашок завжди достатня. Задача 3 . Знайти всі дільники натурального числа N.
Розв’язки: Задача 1. var n,n1,n2,n3,n4,r:integer; begin write('Введіть будь-яке чотирьохзначне число: '); readln(n); n1:=n div 1000; n2:=(n div 100) mod 10; n3:=(n div 10) mod 10; n4:= n mod 10; r:=n4*1000+n3*100+n2*10+n1; if r=n then writeln ('Введене число ',n,' являється поліндромом.') else writeln ('Введене число ',n,' не є поліндромом.') end. Задача 3. var i,n:integer; begin writeln('Введіть натуральне число'); readln(n); writeln('Дільники числа ',n,': '); for i:=1 to n do if n mod i = 0 then write(i,' '); end.
Розв’язок задачі 2 напишу незабаром. А зараз хотілося б почути ваші думки з приводу того, чи оптимально розв’язані задачі 1 та задачі 3. Звичайно, задача 1 не враховує захист від введення не чотиризначного числа, та це легко можна виправити розгалуженням.
Шановні форумчани!!!!! Повідомлення, які не відповідають темі або несуть некорисний зміст будуть видалятись без попередження!!!
[admin]Теми з програмування треба реанімувати! Більшість погоджуються, що це найцікавіший розділ інформатики, а активності не проявляють.[/admin]
Задача. Нещасний Петрик їсть несмачну макаронину завдовжки n км. Першого дня він з’їв половину всієї довжини, другого дня - третину від того, що залишилося, третього дня - четверту частину від того, що залишилося другого дня і т.д. Скільки макаронини ще залишиться йому "домучувати" на m-тий день? Спробуйте розв’язати самостійно. Якщо не вийде відкривайте спойлер. P.S. Можливо є оптимальніший розв’язок, буду вдячний за конструктивні зауваження.
1. Постановка задачі. Дано: n - довжина макаронини в км., n/2 - з’їв Петрик 1-го дня. m - кількість днів, які Петрик їв макаронину. Знайти: що залишиться від початкової довжини макаронини на m-й день. 2. Побудова мат. моделі. R:=n/2 - з’їв Петрик першого дня. n:=n-r - залишилось від початкової довжини після першого дня. R:=n/3 - з’їв Петрик другого дня. n:=n-r - залишилось від початкової довжини після другого дня. R:=n/4 - з’їв Петрик третього дня. n:=n-r - залишилось від початкової довжини після третього дня. Як бачимо, для розв’язання даної задачі потрібно організувати цикл з визначеною кількістю кроків. Найкраще для цього підійде цикл з параметром (for). Код програми:
Code
var i,m:integer; r,n:real; begin readln(n); readln(m); for i:=2 to m do begin R:=n/i; n:=n-R; end; writeln(n); end.
До речі, хто як вважає щодо вибору типу циклу в даній задачі?
Да. Тільки як Ви здогадались? Має бути якесь математичне пояснення. Виходить, що ця задача належить до типу лінійних, але в збірнику лежить в розділі для циклічних...
Я не математик. Тому зрозумів тоді, коли побачив: результати перших запусків з вхідними даними (1,1), (1,2), (1,3), (1,4) утворили підозріло знайомий ряд чисел. Потім змоделював в Excel і пересвідчився.
Я не математик. Тому зрозумів тоді, коли побачив: результати перших запусків з вхідними даними (1,1), (1,2), (1,3), (1,4) утворили підозріло знайомий ряд чисел. Потім змоделював в Excel і пересвідчився.
Оце і є як кажуть КЛАС Бо ми читаемо моделювання, а забуваємо його використовувати. Ось для чого потрібна інформатика.))) +1
Да. Тільки як Ви здогадались? Має бути якесь математичне пояснення. Виходить, що ця задача належить до типу лінійних, але в збірнику лежить в розділі для циклічних...
Задачу пережували. Хоча ІМХО кожен варіант розв’язку має право на життя і пройде тест на валідність. Задача 2. На дверях ліфта висіло загрозливе попередження про те, що двері зачиняються самі в той момент, коли зайвий за вагою пасажир переступить поріг ліфта. Котрий за рахунком пасажир постраждає, якщо ліфт витримує вагу не більше як S кг, а вага пасажирів, що стоять у черзі до ліфта, дорівнює відповідно a1, a2, ... , an?
Мій розв’язок:
sp - сумарна вага пасажирів. Далі все має бути зрозуміло з коду програми:
var s,sp,n,a,i:integer; begin writeln('Введіть масу підйомоспроможності ліфта '); readln(s); writeln('Введіть к-сть пасажирів'); readln(n); sp:=0; i:=0; while sp<=s do begin i:=i+1; writeln('Введіть вагу ',i,' пасажира'); readln(a); sp:=sp+a; end; writeln('постраждає ' ,i, ' пасажир '); end.
Задача сформульована некоректно. Питання слід виправити: "Скільки пасажирів постраждає, якщо ліфт і т.д." Останнього пасажира двері не придушать, оскільки спрацюють, коли він вже переступить поріг. А от летіти після цього будуть разом
Змінна n була б не зайва у випадку, якщо допускається, що пасажирів не вистачить, щоб "завалити" ліфт (умовою задачі це не заборонено). Але в наведеному програмному коді ця змінна дійсно не використовується...
alex, я згоден з Вами, що з використанням масиву розв’язок буде красивішим. Але дана задача знаходиться у збірнику у розділі "алгоритми з повтореннями", тобто вважається, що учні ще не знають масивів, тому я спробував розв’язати її без використання масиву.
Quote (alex)
and (i<n)
згоден з цим зауваженням.
Quote (Пилипчук_О_П)
Задача сформульована некоректно.
Також погоджуюсь з цим. Мабуть спрямую дане зауваження до автора задачі. Мені взагалі подобається дискусія в такому форматі. Так можна не тільки розглянути задачі, але й знайти найкращі алгоритми їх розв’язку.