 |
Вітаю Вас, Гість · RSS |
 |
Задачі шкільного рівня.
|
Ковальчук_Олександр |
Дата: Вт, 11.03.2008, 03:09 | Повідомлення № 1 |
Ветеран спілкування
Повідомлень: 3654
| У гостьовій книзі користувач роман попросив розв’язати кілька простих задач для свого сина. Я вирішив допомогти йому і заодно створити тему, де хтось буде писати умову цікавої задачі шкільного рівня, а інші будуть пропонувати розв’язки цієї задачі. І ми разом серед кількох варіантів розв’язку вибиратимемо найоптимальніший, методично правильний. Тема досить актуальна і цікава. Сподіваюсь, допоможе вчителям, які з різних причин погано знаються на задачах з програмування навіть шкільного рівня (наприклад вчитель, який інформатику читає не за спеціальністю). Отож, задачі з гостьової книги: Задача 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 не враховує захист від введення не чотиризначного числа, та це легко можна виправити розгалуженням. Шановні форумчани!!!!! Повідомлення, які не відповідають темі або несуть некорисний зміст будуть видалятись без попередження!!!
|
|
| | |
dpi |
Дата: Пн, 19.05.2008, 13:46 | Повідомлення № 61 |
Досвідчений вчитель
Повідомлень: 1438
| #include<iostream> using namespace std; int main() { int N,n = 0,m = 0; cout << "Vvedite N: "; cin >> N; if (N > 0) { n = 3; m = 5; } while (N > 1) { n = n + 6; m = m * 2; N --; } cout << n + m; }Додано (19.05.2008, 12:46) --------------------------------------------- Анрей, пиши, если не так.
|
|
| | |
KulAlex |
Дата: Пн, 19.05.2008, 18:26 | Повідомлення № 62 |
Знаток програмування
Повідомлень: 326
| Quote (dpi) Анрей, пиши, если не так. Якщо це до мене то я не Андрій, Ви помилились, я Олександр. Цей розвязок задачі, це до якої задачі??!
|
|
| | |
Varkan |
Дата: Чт, 22.05.2008, 15:04 | Повідомлення № 63 |
Викладач ВУЗу
Повідомлень: 425
| Три прямые на плоскости заданы уравнениями akx+bky=ck, k=1,2,3. Если эти прямые попарно пересекаются и образуют треугольник, тогда найти его площадь.
|
|
| | |
KulAlex |
Дата: Пт, 23.05.2008, 15:03 | Повідомлення № 64 |
Знаток програмування
Повідомлень: 326
| var p,s,a,b,c,a1,a2,a3,b1,b2,b3,c1,c2,c3,x1,x2,x3,y1,y2,y3:real; Function MK(a11,a12,b1,a21,a22,b2:real; var x,y:real):boolean; var d,d1,d2:real; begin MK:=true; d:=a11*a22-a12*a21; writeln(d); if d<>0 then begin d1:=b1*a22-b2*a12; d2:=a11*b2-a21*b1; x:=d1/d; y:=d2/d end else MK:=false end; Function D(x1,y1,x2,y2:real):real; begin d:=sqrt(sqr(x2-x1)+sqr(y2-y1)) end; begin readln(a1,b1,c1); readln(a2,b2,c2); readln(a3,b3,c3); if (MK(a1,b1,c1,a2,b2,c2,x1,y1)) and (MK(a3,b3,c3,a2,b2,c2,x2,y2)) and (MK(a1,b1,c1,a3,b3,c3,x3,y3)) then begin a:=d(x1,y1,x2,y2); b:=d(x2,y2,x3,y3); c:=d(x3,y3,x1,y1); p:=(a+b+c)/2; s:=sqrt(p*(p-a)*(p-b)*(p-c)); writeln(s) end else writeln('no') end.
Відредаговано: KulAlex - Пт, 23.05.2008, 15:04 |
|
| | |
dpi |
Дата: Нд, 08.06.2008, 15:42 | Повідомлення № 65 |
Досвідчений вчитель
Повідомлень: 1438
| Quote (KulAlex) Цей розвязок задачі, це до якої задачі??! Это старая задача про дракона и Васелису. Quote (KulAlex) Function MK(a11,a12,b1,a21,a22,b2:real; var x,y:real):boolean; Плохо знаю Паскаль, если не трудно, объясните идею и основные формулы d:=sqrt(sqr(x2-x1)+sqr(y2-y1)) s:=sqrt(p*(p-a)*(p-b)*(p-c));
|
|
| | |
zverok |
Дата: Нд, 08.06.2008, 21:19 | Повідомлення № 66 |
Креативний вчитель
Повідомлень: 153
| Quote (dpi) Плохо знаю Паскаль, если не трудно, объясните идею и основные формулыd:=sqrt(sqr(x2-x1)+sqr(y2-y1))s:=sqrt(p*(p-a)*(p-b)*(p-c)); sqrt(x) - это квадратный корень из x sqr(x) - x в квадрате. Остальное - математика. например, sqrt( (x2-x1)^2+(y2-y1)^2 ) - это расстояние между точками (x1, y1) и (x2, y2) -- теорема Пифагора.
|
|
| | |
KulAlex |
Дата: Пн, 09.06.2008, 08:30 | Повідомлення № 67 |
Знаток програмування
Повідомлень: 326
| Суть цієї задачі, розвязати систему рівнянь. Я застосував метод Крамера, тому що, цей метод можна реалізувати і для прямих, які паралельні осям координат. Після того, як я знайшов точки перетину прямих (вершини трикутника), потрібно знайти відстань між точками (сторони трикутника). Використав формулі відстані між точками (Геометрія 8 клас), яка виводиться із теореми Піфагора. Quote (dpi) d:=sqrt(sqr(x2-x1)+sqr(y2-y1)) Оскільки є сторони можна знайти і полощу. Формула Герона (Геометрія10 клас) Quote (dpi) s:=sqrt(p*(p-a)*(p-b)*(p-c))
Відредаговано: KulAlex - Пн, 09.06.2008, 08:32 |
|
| | |
dpi |
Дата: Чт, 30.10.2008, 14:58 | Повідомлення № 68 |
Досвідчений вчитель
Повідомлень: 1438
| Quote (KulAlex) Оскільки є сторони можна знайти і полощу. Формула Герона (Геометрія10 клас) Цитата (dpi ) s:=sqrt(p*(p-a)*(p-b)*(p-c)) Щиро дякую.Додано (30.10.2008, 13:58) --------------------------------------------- Господа, олимпиада на носу, а ветка молчит.
|
|
| | |
Newbie |
Дата: Чт, 30.10.2008, 15:28 | Повідомлення № 69 |
Хелпер
Повідомлень: 1412
| цього року, до речі, щось нетрадиційно рано районна олімпіада з інформатики -16 листопада. зазвичай тижні на 2 пізніше
|
|
| | |
vitert |
Дата: Сб, 01.11.2008, 20:05 | Повідомлення № 70 |
Тут живе...
Повідомлень: 174
| Quote (Ковальчук_Олександр) Задача 3 . Знайти всі дільники натурального числа N. Мабуть про цю задачу всі вже дано забули, але я тільки зайшов на цю вітку, тому пропоную свій варіант який думаю найбільш оптимальний оскільки цикл виконується лише до sqrt(n), корінь тут дійсно причому а не N/2 program dilnik; uses crt; var n,k,s,i:integer; begin clrscr; write('n=');readln(n); s:=trunc(sqrt(n)); k:=1; for i:=2 to s do if n mod i=0 then inc(k); if s=sqrt(n) then k:=2*k-1 else k:=2*k; writeln ('k=',k); end.
|
|
| | |
dpi |
Дата: Пн, 03.11.2008, 08:58 | Повідомлення № 71 |
Досвідчений вчитель
Повідомлень: 1438
| в условии требуют делители, а не их количество
|
|
| | |
vitert |
Дата: Пн, 03.11.2008, 18:08 | Повідомлення № 72 |
Тут живе...
Повідомлень: 174
| Quote (dpi) в условии требуют делители, а не их количество Так, я протупив, просто глянув на ті коди що тут писались , а там якраз шукали кількість. Але це в принципі суті не міняє: program dilnik; uses crt; var n,s,m,d,i:integer; begin clrscr; write('n=');readln(n); write('dil ',n,':'); s:=trunc(sqrt(n)); for i:=1 to s do begin m:=n mod i; d:=n div i; if m=0 then if i<>d then write(i,', ',d,', ') else write(i); end; end. Щоправда, якщо дільники потрібно вивести впорядковано, то цей варіант може і не бути оптимальним. Ще одне запитання, як можна в паскалі, і чи можна це, написати функцію x в степені y, якщо x<0. Зрозуміло не використовуючи цикл.
|
|
| | |
filnick |
Дата: Пн, 03.11.2008, 22:55 | Повідомлення № 73 |
Мудрий вчитель
Повідомлень: 2238
| Quote (vitert) Ще одне запитання, як можна в паскалі, і чи можна це, написати функцію x в степені y, якщо x<0. З точки зору математики степенева функція х в степені у при додатніх значеннях у визначена тільки для множини додатніх чисел. Тому при х<0 та y>0 в загальному випадку не визначена. Якщо ж розглядати значення у як ціле число, то при парних у: (-x)^y=x^y, при непарних у: (-x)^y=-x^y
|
|
| | |
KulAlex |
Дата: Пн, 03.11.2008, 23:34 | Повідомлення № 74 |
Знаток програмування
Повідомлень: 326
| Quote (vitert) Ще одне запитання, як можна в паскалі, і чи можна це, написати функцію x в степені y, якщо x<0. Зрозуміло не використовуючи цикл. Дуже гарне питання!!!! 1. В багатьох мовах програмування є стандартна функція піднесення до степення Pow, Power. 2. В мові паскаль треба писати алгоритм, найоптимальніше використовуючи exp() i ln(), тільки аналізцючи аргумент функції ln(). Function Pow(x,y:real):real; begin if x>0 then Pow:=exp(y*ln(x)) else if x<0 then Pow:=-exp(y*ln(-x)) else Pow:=0 end;
Відредаговано: KulAlex - Пн, 03.11.2008, 23:35 |
|
| | |
filnick |
Дата: Вт, 04.11.2008, 00:03 | Повідомлення № 75 |
Мудрий вчитель
Повідомлень: 2238
| Quote (KulAlex) Function Pow(x,y:real):real; begin if x>0 then Pow:=exp(y*ln(x)) else if x<0 then Pow:=-exp(y*ln(-x)) else Pow:=0 end; За цією функцією нуль в нульовому степені дорівнює нулю! а (-4)^0.5=-2 !?
Відредаговано: filnick - Вт, 04.11.2008, 00:16 |
|
| |
© Форум інформатиків України, 2007-2018.  |