Три рыбака легли спать,не плдилив улова.Проснувшись ночью,1-ый рыбак одну,а из остатка
Три рыбака легли почивать,не плдилив улова.Проснувшись ночкой,первый рыбак одну,а из остатка отобрал треть.2-ой и 3-ий поступили подобным образом.Какое меньшее количество рыб может удовлетворять условию задачки?
Составе программку на знаменитым языке программирования.
Поначалу осмотрим такую задачку: Имеется некое количество рыб. Найти, вероятен ли дележ рыб между тремя рыбаками в соответствии с условием задачки Дирака[1] .
В программке решения этой задачки используем последующие величины:
k0 - общее количество пойманных рыб;
k - количество рыб, оставшееся тому или иному рыбаку;
take - количество рыб, которые брал тот либо другой рыбак;
i - номер рыбака;
partit - величина логического типа, определяющая возможность дележа (взятия каждым рыбаком трети оставшегося количества рыб).
На */школьном алгоритмическом языке /*соответствующая программка имеет вид:
_алг_ Available_partition
_нач_ _цел_ k0, k, take, i, _лог_ partit
_вывод_ _нс_, "Введите количество рыб"
_ввод_ k0
k:=k0
i:=1
_нц_ цикл деяний каждого рыбака
k:=k-1 осталось после выбрасывания одной рыбы
_если_ mod(k,n)=0
_то_ i-й рыбак может брать треть оставшихся рыб
partit:=_да_
take:=div(k,3) берет i-й рыбак
k:=k- take оставшееся количество рыб
_иначе_
partit:=_нет_ при k0 рыбах дележ невероятен
_все_
i:=i+1
_кц___при_ igt;n _либо_ _не_ partit
_если_ partit
_то_
_вывод_ _нс_, "При таком количестве рыб дележ возможен"
_по другому_
_вывод_ _нс_, "При таком количестве рыб дележ невозможен"
_все_
_кон_
После этого программа нахождения минимального количества рыб, удовлетворяющего условию задачки Дирака, может быть оформлена очень коротко:
_алг_ Задача_Рыбаки_и_рыбки
_нач_ _цел_ k0
k0:=0 изначальное значение спектра поиска
_нц_ _пока_ _не_ Avail_partit (k0)
k0:=k0+1 еще одно значение
_кц_
_вывод_ _нс_, "Меньшее количество рыб,"
_вывод_ "удовлетворяющее условию задачки:", k0
_кон_
где Avail_partit(k0) - вспомогательная функция логического типа, определяющая возможность дележа k0/ /рыб в соответствии с условием задачки, составленная на базе программы, приведенной чуть выше:
алг_ _лог_ Avail_partit (_арг_ _цел_ k0)
_нач_ _цел_ k, take, i, _лог_ partit
k:=k0
i:=1
_нц_
k:=k-1
_если_ mod(k,3)=0
_то_
partit:=_да_
take:=div(k,3)
k:=k- take
_по другому_
partit:=_нет_
_все_
i:=i+1
_кц___при_ igt;3 _или_ _не_ partit
_знач_:= partit значение функции
_кон_
Соответствующая программа на Паскале:
Задачка Рыбаки и рыбки
Var
k0: integer;
Function Avail_partit (k0: integer): boolean;
Var
k, take, i: integer;
partit: boolean;
begin
k:=k0;
i:=1;
repeat цикл действий каждого рыбака
k:=k-1; осталось после выбрасывания одной рыбы
if k mod 3 = 0 then
i-й рыбак может брать третья часть оставшихся рыб
begin
partit:=true;
take:=k div 3; берет i-й рыбак
k:=k - take оставшееся количество рыб
end
else
partit:=false; дележ невероятен
i:=i+1
until (igt;3) or not partit;
Avail_partit:= partit значение функции
end;
BEGIN Главной программки
k0:=0; изначальное значение спектра поиска
while not Avail_partit(k0) do
k0:=k0+1; еще одно значение
write('Меньшее количество рыб, ');
writeln('удовлетворяющее условию задачки: ', k0)
END.
Выполнив программку, можно узреть, что малое количество рыб, удовлетворяющее условию задачки, одинаково 25. Имеются и великие значения (52, 79, 106, ...).
Имеется и иной способ решения задачки. Можно, так сказать, идти не от общего количества пойманных рыб, а от числа рыб, доставшихся третьему рыбаку. Если эту величину обозначить take3, то можно записать, что количество рыб, оставшееся тому либо иному рыбаку, одинаково:
1) третьему рыбаку: k3 = 3* take3 + 1;
2) второму: k2 = 3*k3 + 1;
3) первому (то есть общее количество пойманных рыб[2]): k1 = 3*k2 + 1.
Перебирая значения k3, одинаковые 1, 2, 3, , можно отыскать такое малое число, при котором значения величин k2 и k1 есть целые числа.
Программа, реализующая таковой подход к решению задачки, имеет вид:
Задача "Рыбаки и рыбки"
Var
take3, k3: word;
k2, k1: real;
BEGIN
take3:=1;
repeat
k3:=3* take3+1;
k2:=k3*3/2+1;
k1:=k2*3/2+1;
take3:= take3+1
until (TRUNC(k2)=k2) and (TRUNC(k1)=k1);
write('Меньшее количество рыб, ');
writeln('удовлетворяющее условию задачки: ', TRUNC(k1))
END.
Рассмотренную задачку можно решать и при другом числе рыбаков. Подходящие результаты представлены в таблице (естественно, что некие из их являются условными).
Число рыбаков
4
5
6
7
Разыскиваемое количество рыб
253
3121
46651
823537
-
Вопросы ответы
Статьи
Информатика
Статьи
Математика.
Разные вопросы.
Разные вопросы.
Математика.
Разные вопросы.
Математика.
Физика.
Геометрия.
Разные вопросы.
Обществознание.