• Три рыбака легли спать,не плдилив улова.Проснувшись ночью,первый рыбак одну,а из остатка забрал треть.Второй и третий поступили аналогичным образом.Какое наименьшее количество рыб может удовлетворять условию задачи?
    Составе программу на известным языке программирования.

Ответы 3

  • В иготе какой ответ?
  • 23
  • Сначала рассмотрим такую задачу: “Имеется некоторое количество рыб. Определить, возможен ли дележ рыб между тремя рыбаками в соответствии с условием задачи Дирака”[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

    ¦ _кц___при_ i>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

    ¦ _кц___при_ i>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 (i>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

  • Добавить свой ответ

Войти через Google

или

Забыли пароль?

У меня нет аккаунта, я хочу Зарегистрироваться

How much to ban the user?
1 hour 1 day 100 years