Задачка для 3-го класса

vott.ru — про орехи и хомяка, с разведопроса с Савватеевым, текст в первом
Новости, Наука | Mafia 20:58 12.04.2019
2 комментария | 35 за, 1 против |
#1 | 22:31 12.04.2019 | Кому: Mafia
> Если расписать все действия, то получится много скобочек и дробей: (((((x-1)*3/4 -1)*3/4)-1)*3/4-1)*3/4 /4
> После раскрытия скобок останется (81x-525)/1024
> Т.е. x должен оказаться таким, чтоб (81x-525)/1024 было целым числом.
> Умножаем x на 81, вычитаем 525, - должно разделиться на 1024 нацело.
> Т.е. остаток от деления на 1024 должен быть равен 0.
> 81x - 525 = 0 (1024)
> (модулярная арифметика, считаем всё по модулю 1024).
> 81x = 525 = 0 (1024)
> x = 81^-1 * 525 = 177 * 525 = 765 (1024)
> 81^-1 - обратное по модулю 1024 (такое число, которое при умножении на 81 даёт 1), продвинутые калькуляторы берут, либо на бумажке - обобщённый алгоритм Евклида, либо цепными дробями вот так.
> 177 * 81 = 14337 = 1 (1024).
>
> Ну и видно, что ответом будет не только 765, но и всё что даёт 765 в остатке при делении на 1024, т.е. числа вида 765 + 1024*k

Сложно для 3 класса, вот так проще:

static void Main(string[] args)
        {
            var array = new double[6];

            do
            {
                array[0]++;
                array[1] = 4 * array[0];

                for (int j = 0; j < 4; j++)
                {
                    array[j + 2] = 4 * array[j + 1] / 3 + 1;
                }
            }
            while (array.Any(x => (x - Math.Truncate(x)) > Double.Epsilon));

            Console.WriteLine(string.Join(" ", array));
            Console.ReadKey();
        }
#2 | 06:29 13.04.2019 | Кому: врач
> И как с этим работает пользователь? Это же программа не для конкретной задачи, а для всех задач подобного типа, или решает только вот эту, а в программе записан ход конкретных вычислений? Иными словами: решит эта программа задачу, если в семье будет пять человек (один из которых, пока никого нет, берёт не пятую часть, а половину) и два хомяка?

Не, это код, который решает конкретно этот пример. Запускаешь и видишь на экране ответ, все.
Никакого практического применения, просто кому-то проще решить пример на бумажке, кто-то выше в Excel решал, мне проще написать 8 строк кода.
Про то, что 3-клашкам проще так решать, это ирония была ;-)

> Я даже не знаю, что такое терминал. Да и в записанной Ильёй программе не вижу никаких формул (традиционных во всяком случае). Слова "орехи", "забрали", "было" нашёл у Злого, но там без узнаваемых формул.


Задача решается перебором с конца.
Предполагается, что в самом конце семья съела по A ореху, тогда у них было B = 4*A орехов, тогда у мамы было C = 4/3*B + 1 орехов, тогда у дочи было D = 4/3*C + 1, у сына E = 4/3*D + 1, и наконец у папы F = 4/3*E + 1.
Последние 4 формулы одинаковые поэтому записаны у меня в цикле как X(i+1) = 4/3*X(i) + 1.
После того как все A,B,C,D,E,F (для удобства они у меня в одном массиве из 6 элементов, где А это array[0], B - array[1] и т.д.) найдены, проверяется, что все они целые, если нет, то A берет на единицу больше и все повторяется заново.

Решать перебором не самый эффективный способ, но зато самый быстрый в реализации, а учитывая, что мне нужно было просто решить задачку, а не писать прикладной софт для решения подобных задач.
Войдите или зарегистрируйтесь чтобы писать комментарии.