Требуется алгоритм, который позволит вывести число 1 в случае, если одно из двух чисел $%M,N$% делится на другое, и 0 в противном случае (0 на 0 не делится). Заданы целые числа $%M,N$%. Разрешены только арифметические операции, модуль, целая часть от деления и остаток от деления. задан 16 Сен '14 18:19 student
показано 5 из 8
показать еще 3
|
С Вашей "подачи" можно завершить тот план, который был намечен в комментариях. Пусть функция $%f(x)=1{\rm\,\,div\,}(1+|x|)$% построена. Вместо $%m{\rm\,mod\,} n$%, дающего некорректный ответ при $%n=0$%, рассмотрим исправленную функцию $%(m(1-f(n))+f(n)){\rm mod\,} (n+2f(n))$%. При $%n\ne0$% это даст обычный остаток. При $%n=0$% будет $%1{\,\rm mod\,}2=1$%. Обозначим эту функцию через $%g(m,n)$%. Её значение равно нулю тогда и только тогда, когда $%m$% делится на $%n$% по определению делимости. Беря произведение $%g(m,n)g(n,m)$%, получаем 0 в случае делимости в ту или другую сторону, и не 0 в противном случае. Далее применяем $%f$% к результату. Я проверил в Maple -- всё работает корректно. отвечен 16 Сен '14 22:01 falcao При M=N=0 выдает единицу.
(16 Сен '14 22:08)
student
@falcao: нужно результат после обработки в $%f$% умножить на $%(|m|+|n|)$% и применить к новому результату операцию $%1-f$%.
(16 Сен '14 22:29)
student
|
А что мешает проверить if (M % N == 0 or N % M == 0)? Выводим единичку else, выводим 0.
@void_pointer: да, забыл главное - нельзя использовать условные операторы, циклы и прочее.
Хочу уточнить одну вещь по условию. Рассмотрим такой вариант: (m mod n)(n mod m). Если одно число делится на другое, то один из остатков будет равен нулю, и произведение тоже. Если не делится, то получится ненулевое число. Далее можно применить функцию f, где f(0)=1 и f(x)=0 при остальных x. Если условно считать, что 0 div 0 = 0, x div x = 1, то годится 1-(x div x). Но проблема в том, что при делении на 0 будет выдана, скорее всего, ошибка. Например, Maple так реагирует на 0 div 0. При этом 0*(0 div 0) она вычисляет, выдавая ответ 0. Поэтому надо бы уточнить "правила игры".
@falcao: я пишу программу на паскале. Нужно учесть все случаи, в том числе один или два нуля.
Maple использует язык, похожий на Паскаль. Я думаю, здесь играют роль некоторые чисто формальные вещи, а именно процесс вычисления арифметических выражений. Я привёл пример с 0*(нечто), где ответом будет 0, даже если нечто не определено. Суть в том, что раз условного оператора нет, то m на n, скорее всего, придётся делить, но надо защититься от случая деления на ноль каким-то искусственным способом.
@falcao: да, но как это сделать - это и есть мой вопрос.
@falcao:
Давайте будем использовать функцию 1 div (1+|x|).
Да, эта вещь годится. Видимо, какой-то аналогичный трюк подойдёт и для (m mod n)(n mod m). Там тоже надо обезопасить эти выражения от возможного деления на 0 каким-то аналогичным способом. То есть достаточно придумать выражение, дающее настоящий остаток при делении не на 0, и 1 (или что-то ненулевое) при попытке делить на 0.