Страницы: 1 2 След.
RSS
Задача по общему количеству коров, какую формулу использовать?
 
Добрый день, наткнулся на интересную задачу, буду искренне благодарен если кто поможет ее решить.

У фермера есть 1 корова, каждый год корова приносит потомство в виде одной коровки или бычка. Среднее продолжительность жизни коровы 7 лет. Каждая коровка может начать приносить потомство только со второго года после рождения, т.е. в итоге она может принести потомство в виде 6 телят. Бычки рождается по четным годам, коровки по не четным (1ый год - нету потомства, 2ой год - бычек, 3ий год - коровка, 4ый год - бычек и т.д.). Далее бычков не берем во внимание, останавливаемся на коровках, т.к. они также будут приносить нам потомство дальше. В итоге сколько коров может быть в течении 40 лет?

Скажите пожалуйста какую формулу или ряд формул мне стоит использовать чтобы решить такую задачку (без помощи VBA)?

Заранее благодарю Вас.
 
Вообще эта задача решается через логарифмы; такая функция в Excel есть.
 
Будьте добры объясните подробнее как это можно сделать?
 
Это ж классическая задача Фиббоначи
http://podskazok.net/matematicheskie-zadachi/zadacha-o-razmnozhenii-krolikov.html

Только у вас выходит
0-0-1-0-1-0-1, т.е. удвоение дает каждое 5 и 7 число.

Т.к. у вас каждый четный год выпадает, то по сути вам надо найти сумму чисел Фиббоначи до 20
как это сделать:
https://ru.stackoverflow.com/questions/73573/%D0%A1%D1%83%D0%BC%D0%BC%D0%B0-%D1%80%D1%8F%D0%B4%D0%B0-%D0%A4%D0%B8%D0%B1%D0%BE%D0%BD%D0%B0%D1%87%D1%87%D0%B8#73578
Изменено: panix1111 - 23.07.2017 20:03:45
Мы в Екселе не работаем, мы в нём живём!
 
Без макросов не умею, а макросом:
Код
Sub fiboncal()
   lim = 20
   Result = 1

  fib0 = 0
  fib1 = 1

For i = 2 To lim
    fib = fib1 + fib0
    Result = Result + fib
    fib0 = fib1
    fib1 = fib
Next i

    MsgBox "Cows is " & Result
End Sub

Код основан на : http://el-prog.narod.ru/pascal47.html
Проверка: https://wpcalc.com/posledovatelnost-fibonachchi-kalkulyator/
(Ответ 17710)
Мы в Екселе не работаем, мы в нём живём!
 
panix1111, благодарю Вас за ответ, все подробно и ясно. Сейчас попробую сделать с помощью формул.

Скажите пожалуйста, а мы учитываем тут то что после 7 лет корова больше не будет нести потомство?
 
учитываем, но я таки ошибся
смотрите:

это картинка с выборошеными 0 годами и сумма. Выходт, каждое последующее часло - сумма ТРЕХ предидущих
Значит правильно вычислять так:
ABCD
113=SUM(A1:C1)
Дальше тянем ячейку с формулой до 20 столбца (Т)
И находим сумму всех ячеек.

И макросом:
Код
Sub CowCal()
lim = 20
Result = 4
  fib0 = 1
  fib1 = 1
  fib2 = 2

For i = 4 To lim
    fib = fib2 + fib1 + fib0
    Result = Result + fib
    fib0 = fib1
    fib1 = fib2
    fib2 = fib
Next i

 MsgBox "Cows is " & Result
End Sub
Изменено: panix1111 - 24.07.2017 00:01:11
Мы в Екселе не работаем, мы в нём живём!
 
panix1111, еще раз благодарю Вас за ответ.

У меня получилось, если считать формулой - 786434, чет слишком много, но может и правильно  :)

Я к такому ответу пришел путем того что у нас зрелых (з) и молодых (м) коровок каждый год одинаковое число, т.е. в 3 год - 1 з 1 м, 5 год - 2 з 2 м, 7 год - 4 з 4 м, 9 год - 7 з 7 м (тут и дальше мы должны вычесть 1,т.к. одно коровка становиться не способна нести потомство), 11 год - 13 з 13 м, 13 год - 25 з 25 м....

Как Вы считатете верно ли мое суждение?
 
Цитата
armikdjan написал:
У меня получилось, если считать формулой - 786434, чет слишком много
Вот бы кот Матроскин порадовался! ))
 
Не может быть два разных решения одной задачи.
У меня выходит 144664. Значит какойто из алгоритмов неправильный
Мы в Екселе не работаем, мы в нём живём!
 
panix1111, согласен с Вами, а как Вы думаете по поводу моего решения где сумма коровок равна 786434?
 
покажите книгу или формулу, как оно у вас вышло - тогда можно добавить конкретики
посчитайте на небольшом масиве - например, для 18 лет что у вас выходит?
Изменено: panix1111 - 23.07.2017 22:20:34
Мы в Екселе не работаем, мы в нём живём!
 
panix1111, я сразу сделал до 40 лет и вместе с бычками.
Изменено: armikdjan - 23.07.2017 22:38:22
 
смотрите, не считая непонятного мне дублирования у нас до значения 13 - всё совпадает:

Далее начинаются расхождения.
Для того, чтоб получить значение 49 надо сложить потомство за 4 поколения, а  97 - пяти.
Т.е. как раз у вас нет учета смерти, и к-во поколений считается по нарастающей, тогда как у меня строго три поколения
посмотрите файл, я там цветами обозначил, из чего будет состоять 4 поколение.
Мы в Екселе не работаем, мы в нём живём!
 
Цитата
Михаил С. написал:
Вообще эта задача решается через логарифмы
Пока пытался вспомнить математику тут уже столько понаписали, до чисел Фибоначи дошли. Вы уверены что логарифм(ы) помогут ? Для моего личного развития, КАК ?
 
panix1111, у Вас верно, я нашел свою ошибку, я фактически вычитал 1 корову с каждого года, а нужно было больше т.к. количество коровок с годами все растет и тем самым умирать будет больше. В таком случае как Вы считате, будут ли верны наши суждения?
 
Цитата
VSerg написал:
Вы уверены что логарифм(ы) помогут ?
Не уверен.
Последний раз математикой серьезно я занимался более 35 лет назад.
 
Сделал свою модель (два варианта), оба результата расходятся с тем, что здесь было предложено.

Варианты отличаются тем, когда рождается потомство, в начале года жизни или в конце
Например, если бычок рождается в начале 2го года жизни, но к концу года корове будет 2 года, бычку 1 год (скорее всего не правильно)
Если в конце года, то к концу 2го года жизни корове будет 2 года, бычку 0 лет (только что родился)
Поэтому вариант 2, скорее всего, более правильный.
Изменено: MCH - 24.07.2017 08:34:36
 
Доброе время суток
Цитата
MCH написал:
Поэтому вариант 2, скорее всего, более правильный.
"Лобовое" рекурсивное решение совпадает со 2 вариантом.
Код
Private Const YearCount As Long = 40
Private FNewBornCount As Long
Private FDeathCount As Long


Public Sub TestCows()
    FNewBornCount = 0
    FDeathCount = 0
    NextBorn 0
    Debug.Print "Всего родилось коров " & CStr(FNewBornCount)
    Debug.Print "Всего умерло коров " & CStr(FDeathCount)
    Debug.Print "Количество коров на текущий год " & CStr(FNewBornCount - FDeathCount)
End Sub

Private Sub NextBorn(ByVal itsYear As Long)
    FNewBornCount = FNewBornCount + 1
    If (itsYear + 3) <= YearCount Then NextBorn itsYear + 3
    If (itsYear + 5) <= YearCount Then NextBorn itsYear + 5
    If (itsYear + 7) <= YearCount Then NextBorn itsYear + 7
    If (itsYear + 8) <= YearCount Then FDeathCount = FDeathCount + 1
End Sub
 
тут уже даже ради матиматики: ваш вар. 1 абсолютно совпадает с моим, и у вас и у меня в 40 году 121 415 коров.
Разницу дает то, как считать бычков. В условиях задачи сказано, что "ДАЛЬШЕ бычков не считаем". Означает ли это что бычка нужно считать в год рождения или означает что его вообще не считать?
Дальше как считать итог.
Тут унас явно спрашивают только про коров.
Цитата
сколько коров может быть в течении 40 лет
т.е. в любом случае нам надо сумма всех коров живших у нас за 40 лет. И ваш вар. 1 и мой дают одно число 266078 +- 1 корова.
Мы в Екселе не работаем, мы в нём живём!
 
Мой вариант совпадает с вариантом 1 от МСН - 121415.
Рекурентная формула для нечетного года:   (N(i-2)-N(i-7)/2)*2, где i-номер года
Формула для четного года: N(i-1)-N(i-6)/2

Можно посчитать умерших к данному году:
для четного года: D(i-2)+N(i-7)/2
итого по итогам 40 лет умерло 23249
В сумме всего коров было получается 144664
Изменено: Gauss - 24.07.2017 10:31:51
 
Цитата
panix1111 написал:
и у вас и у меня в 40 году 121 415 коров.
Что-то, честно говоря, ничего не понимаю, каким образом может получится такое количество
Опять же в "лоб" рекурсией с допущением, что начиная с 3 года от рождения корова до года ограничения каждые два года рождает очередную корову
Код
Private Const YearCount As Long = 40
Private FNewBornCount As Long
Private FDeathCount As Long

Public Sub TestCows()
    FNewBornCount = 0
    FDeathCount = 0
    NextBorn2 0
    Debug.Print "Всего родилось коров " & CStr(FNewBornCount)
End Sub

Private Sub NextBorn2(ByVal itsYear As Long)
    Dim i As Long
    FNewBornCount = FNewBornCount + 1
    For i = itsYear + 3 To YearCount Step 2
        NextBorn2 i
    Next
End Sub

Результат
Всего родилось коров 55405
Изменено: Андрей VG - 24.07.2017 10:01:22 (Убрал нелогичный вывод о числе умерших, в допущении - они бессмертны :) )
 
А вот я так понял, что считаем мы только коров (тёлочек), и за весь период (а не по состоянию на N-ный год). То есть "умирающих/нерепродуктивных" коров считать/вычитать не надо.
Так что сначала давайте определимся вообще, какой "правильный" ответ должен получаться. И вот у меня ответ тоже совпадает со 2 вариантом Михаила (если учитывать "выбывающих", см. приложенный файл), и, естественно, значением FNewBornCount Андрея (из первого примера) = 12688
Код
Const limit = 40

Function countCows(age)
    Dim sum
    sum = 0
    If age + 3 <= limit Then sum = sum + 1 + countCows(age + 3)
    If age + 5 <= limit Then sum = sum + 1 + countCows(age + 5)
    If age + 7 <= limit Then sum = sum + 1 + countCows(age + 7)
    countCows = sum
End Function

Sub test()
    Debug.Print "Всего коров за период " & (1 + countCows(0))
End Sub

Андрей, во втором макросе ты нарушаешь условия задачи - у одной коровы может быть не более трёх коров-потомков :)
Если ограничить условия правильно:
Код
' ...
For i = itsYear + 3 To WorksheetFunction.Min(itsYear + 7, YearCount) Step 2
' ...
то получим опять тот же ответ = 12688

Изменено: AndreTM - 24.07.2017 11:08:44
 
Обновил свой предыдущий комментарий, я так понимаю правильный ответ никто не знает?
 
похоже, задача про "невзлетит" самолет в ексель-версии :)
Мы в Екселе не работаем, мы в нём живём!
 
Цитата
AndreTM написал:
Андрей, во втором макросе ты нарушаешь условия задачи - у одной коровы может быть не более трёх коров-потомков
Андрей, да я привёл это, чтобы сопоставить с  количеством, получаемым коллегами, если считать коров бессмертными, то есть да с нарушением, но и в этом случае никак не получается больше 100 000 штук. Как можно получить более 121415. или даже 266078 +- 1 в голове не укладывается. Прямой перебор запрещает такой результат.
 
мой примитив коровы . сначала хотел на стенке на обоях расписать...
на тридцать девятый год будет 66012 коров. всего за 39 лет будет 144663. вернее 144663 + самая первая корова.
Изменено: copper-top - 24.07.2017 11:04:40
 
В общем, поправил я свое предыдущее сообщение, смотрите, считайте...
Я продолжу утверждать, что правильным ответом будет 12688  :)  
 
Как я решал задачу про коровы:
Мы в Екселе не работаем, мы в нём живём!
 
panix1111, Все верно, я с вами согласен. По сути дела мы удваиваем количество коров в четный год, то есть по логике вещей у нас всего 4 коровы, то логично сообразить что они принесут потомство ввиде 4 молодых коровок. Тем самым мы удваиваем наш результат, потом через два года происходит такая же ситуация только за вычетом коров которые были рождены 8 лет назад - эти коровы уже не способны нести потомство (их исключаем из задачи). Но в принципе я попробовал сделать как Вы говорите, т.е. сложить 3 предыдущих результата, то у меня получилось точно такое же число что и если бы я удваивал результат и вычитал количество коров которы были рождены 8 лет назад.

З.Ы. Спасибо Вам за разбор задачи))) Вы мне вчера очень помогли))
Изменено: armikdjan - 24.07.2017 13:37:48
Страницы: 1 2 След.
Наверх