середа, 26 листопада 2014 р.

Вінницька (міська) олімпіада з інформатики 24 грудня 2011 року 8-9 клас

  

Вінницька (міська) олімпіада
з інформатики  24 грудня 2011 року
Розв’язання задач
8-9 клас
1.     Populyatsia
Є популяція комах, розмір якої по днях змінюється згідно закону:
А)  p{n+1} =   0,   якщо p(n) = 0 або 1;
Б)  p{n+1} =   p(n) / 2,   якщо p(n) є парним;
В) p{n+1} =    3 * p(n ) + 1,  якщо p(n) є непарним,
де n – порядковий номер дня, р(n) – розмір популяції на n-й день.
 Необхідно, по заданому розміру популяції на перший день визначити, на який день вона вимре.

 Припустимо, що у перший день (n=1) популяція (p(n))складалася з трьох комах. Тоді вона вимре на 9-й день:
  Номер дня  (n)               1         2        3        4        5        6        7        8        9
 Розмір популяції р(n)   3        10      5        16      8        4        2        1        0

   Технічні умови  Програма читає з клавіатури одне додатне ціле число  – розмір популяції комах на перший день. Програма виводить на екран шукане число. Гарантується, що популяція не проіснує більше 30000 днів.

Приклад.
Введення  3
Виведення 9
Програма на мові  Pascal


Program  Populyatsia
var p, n: integer;
begin
read(p);
n:=1;
while p>0 do
begin
if p=1 then p:=0
 else if p mod 2=0 then p:=p div 2
  else if p mod 2<>0 then p:=3*p+1;
n:=n+1;
end;
if n>30001 then n:=30001;
write(n);
end.



2. DROBY
Васі приснився сон, що він потрапив у чарівну країну Математика, там його узяв у полон злий учений, що розробляв план знищення цієї чарівної країни. Учений знав, що Вася добре знає математику і поставив таку умову, що якщо Вася напише в порядку зростання всі правильні нескоротні дроби, знаменники яких не перевищують заданого числа N, то злий геній відпустить його. Допоможіть  Васі вибратися з полону.
Технічні умови.   Програма читає з клавіатури єдине число  N (2 <= N <= 255). Програма виводить на екран всі шукані дроби спочатку чисельник, а потім знаменник. Всі числа розділено пропусками.
Приклад
                Введення  5
                Виведення  1 5 1 4 1 3 2 5 1 2 3 5 2 3 3 4 4 5
Програма на мові  Pascal



Program  DROBY
var chis, znam:array[1..10000]  of integer;
var n, znamen, chisel, dilnuk, kilk, i, j, buf:integer;
var value1, value2:real;
var p: boolean;
begin
read(n); kilk:=1;
For znamen:=2 to n do
 For chisel:=1 to znamen-1 do
  Begin
   p:=true;
   for dilnuk:=2 to chisel  do
    if (chisel mod dilnuk=0) and (znamen mod dilnuk=0)
    then p:=false;
   if p=true
   then
   begin
   chis[kilk]:=chisel;
   znam[kilk]:=znamen;
   kilk:=kilk+1;
   end;
  end;
  kilk:=kilk-1;
For i:=1 to kilk-1 do
 begin
  for j:=1 to kilk-i do
  begin
   value1:=chis[j] / znam[j];
   value2:=chis[kilk-i+1] / znam[kilk-i+1];
   if value1 > value2 then
    begin
    buf:=chis[j];
    chis[j]:=chis[kilk-i+1];
    chis[kilk-i+1]:=buf;
    buf:=znam[j];
    znam[j]:=znam[kilk-i+1];
    znam[kilk-i+1]:=buf;
    end;
   end
 end;
for i:=1 to kilk do
 Write(chis[i],' ',znam[i],' ');
end.



3. SPIRAL
Вася захоплювався програмуванням і отримав завдання: написати програму,що виводить  квадрат, який складається з NхN клітинок, заповнених числами від 1 до N2  по спіралі. Допоможіть йому.
Технічні умови. Програма читає з клавіатури єдине натуральне число N ( не більше 100). Програма виводить N рядків по N чисел, розділених пропусками. Не допускається починати спіраль в іншому куті, окрім верхнього лівого,  закручувати спіраль проти годинникової стрілки або з середини назовні.
Приклад
 Введення  5
 Виведення   1   2   3   4   5
                        16 17 18 19 6
                        15 24 25 20 7
                        14 23 22 21 8
                        13 12 11 10 9

Програма на мові  Pascal


Program SPIRAL
var n, k,i,j, p, ost, per, r:integer;
var a:array[1..101,1..101] of integer;
begin
read(n);
k:=1;
for i:= 1 to n do
 for j:=1 to n do
  a[i,j]:=0;
 ost:=n; per:=1;
 while k<=n*n do
 begin
 for j:=per to ost do
   begin
   a[per,j]:=k;
   k:=k+1;
   end;
 for i:=per+1 to ost do
   begin
   a[i,ost]:=k;
   k:=k+1;
   end;
  for j:=ost-1 downto per do
  begin
   a[ost,j]:=k;
   k:=k+1;
   end;
   for i:=ost-1 downto per+1 do
    begin
   a[i,per]:=k;
   k:=k+1;
   end;
   ost:=ost-1; per:=per+1;
  end;
  for i:=1 to n do
   begin
    for j:=1 to n do
     write(a[i,j],' ');
    writeln;
   end;

end.

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

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