Требуется алгоритм, который позволит вывести число 1 в случае, если одно из двух чисел $%M,N$% делится на другое, и 0 в противном случае (0 на 0 не делится). Заданы целые числа $%M,N$%. Разрешены только арифметические операции, модуль, целая часть от деления и остаток от деления.

задан 16 Сен '14 18:19

изменен 16 Сен '14 20:06

А что мешает проверить if (M % N == 0 or N % M == 0)? Выводим единичку else, выводим 0.

(16 Сен '14 20:05) void_pointer

@void_pointer: да, забыл главное - нельзя использовать условные операторы, циклы и прочее.

(16 Сен '14 20:06) student

Хочу уточнить одну вещь по условию. Рассмотрим такой вариант: (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. Поэтому надо бы уточнить "правила игры".

(16 Сен '14 20:41) falcao

@falcao: я пишу программу на паскале. Нужно учесть все случаи, в том числе один или два нуля.

(16 Сен '14 20:43) student

Maple использует язык, похожий на Паскаль. Я думаю, здесь играют роль некоторые чисто формальные вещи, а именно процесс вычисления арифметических выражений. Я привёл пример с 0*(нечто), где ответом будет 0, даже если нечто не определено. Суть в том, что раз условного оператора нет, то m на n, скорее всего, придётся делить, но надо защититься от случая деления на ноль каким-то искусственным способом.

(16 Сен '14 20:50) falcao

@falcao: да, но как это сделать - это и есть мой вопрос.

(16 Сен '14 20:57) student
1

@falcao:

Далее можно применить функцию f, где f(0)=1 и f(x)=0

Давайте будем использовать функцию 1 div (1+|x|).

(16 Сен '14 21:26) student

Да, эта вещь годится. Видимо, какой-то аналогичный трюк подойдёт и для (m mod n)(n mod m). Там тоже надо обезопасить эти выражения от возможного деления на 0 каким-то аналогичным способом. То есть достаточно придумать выражение, дающее настоящий остаток при делении не на 0, и 1 (или что-то ненулевое) при попытке делить на 0.

(16 Сен '14 21:32) falcao
показано 5 из 8 показать еще 3
10|600 символов нужно символов осталось
1

С Вашей "подачи" можно завершить тот план, который был намечен в комментариях.

Пусть функция $%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

При M=N=0 выдает единицу.

(16 Сен '14 22:08) student

@falcao: нужно результат после обработки в $%f$% умножить на $%(|m|+|n|)$% и применить к новому результату операцию $%1-f$%.

(16 Сен '14 22:29) student

@student: нет, там всё правильно получается. Значение g(0,0)=1, произведение тоже. Это означает отсутствие делимости. Когда мы применяем в конце f к результату, то есть к g(m,n)g(n,m), то будет f(1)=0.

(16 Сен '14 22:34) falcao
10|600 символов нужно символов осталось
Ваш ответ

Если вы не нашли ответ, задайте вопрос.

Здравствуйте

Математика - это совместно редактируемый форум вопросов и ответов для начинающих и опытных математиков, с особенным акцентом на компьютерные науки.

Присоединяйтесь!

отмечен:

×84
×76

задан
16 Сен '14 18:19

показан
668 раз

обновлен
16 Сен '14 22:34

Отслеживать вопрос

по почте:

Зарегистрировавшись, вы сможете подписаться на любые обновления

по RSS:

Ответы

Ответы и Комментарии

Дизайн сайта/логотип © «Сеть Знаний». Контент распространяется под лицензией cc by-sa 3.0 с обязательным указанием авторства.
Рейтинг@Mail.ru