Вінницька
(міська) олімпіада
з
інформатики 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.
Немає коментарів:
Дописати коментар