> Если расписать все действия, то получится много скобочек и дробей: (((((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
> И как с этим работает пользователь? Это же программа не для конкретной задачи, а для всех задач подобного типа, или решает только вот эту, а в программе записан ход конкретных вычислений? Иными словами: решит эта программа задачу, если в семье будет пять человек (один из которых, пока никого нет, берёт не пятую часть, а половину) и два хомяка?
Не, это код, который решает конкретно этот пример. Запускаешь и видишь на экране ответ, все.
Никакого практического применения, просто кому-то проще решить пример на бумажке, кто-то выше в 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 берет на единицу больше и все повторяется заново.
Решать перебором не самый эффективный способ, но зато самый быстрый в реализации, а учитывая, что мне нужно было просто решить задачку, а не писать прикладной софт для решения подобных задач.
> После раскрытия скобок останется (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 класса, вот так проще: