Логическая операция исключающее или (она же сложение по модулю два) имеет ряд неожиданных применений. Пусть дан массив чисел, в котором все числа кроме одного встречаются дважды, и только одно не имеет пары. Надо придумать алгоритм нахождения этого числа. Если кто-то догадался, как можно просто это сделать, высказывайте свои мнения. IQFun.ru - играем и растём над собой. Авторские игры, головоломки, кроссворды онлайн, интересные статьи.
Сообщение отредактировал IQFun - Сб, 29.01.22, 19:46
Переводим все числа в двоичную систему, складываем побитно все возможные пары в Z/2Z, если при сложении получается 0 то эти числа одинаковы их отбрасываем. Продолжаем пока не наткнемся на число которое при таком сложении с остальными не даёт 0, это и будет искомое число в данном массиве. ʎʞнɐнԑиɐнʎdǝфɔ ৭ꓕɐʚиhɐdoʚыʚ ꙕǝᥕʎ
Сообщение отредактировал Фигаро - Чт, 03.02.22, 20:59
Ответ: надо просто поксорить все элементы массива, в результате получим искомое число. Потому что пары одинаковых чисел дадут в результате нули. Даже опытные программисты могут здесь предложить хеш-таблицу и прочие штуки для ускорения расчётов, а ларчик открывается просто с пом. xor. IQFun.ru - играем и растём над собой. Авторские игры, головоломки, кроссворды онлайн, интересные статьи.
IQFun, а чем отличается то что написал я от того что написали вы? Для чего вы задаёте вопрос, ответ на который вы не способны понять? ʎʞнɐнԑиɐнʎdǝфɔ ৭ꓕɐʚиhɐdoʚыʚ ꙕǝᥕʎ
IQFun, а чем отличается то что написал я от того что написали вы?Для чего вы задаёте вопрос, ответ на который вы не способны понять?
Мой ответ короче, надо просто ещё раз его прочитать. (В нём не надо складывать всевозможные пары.) IQFun.ru - играем и растём над собой. Авторские игры, головоломки, кроссворды онлайн, интересные статьи.
IQFun, теперь я понял, вы не только ответы не можете понять, вы не понимаете даже то что пишите сами. Вы предложили внимательней почитать, так давайте это сделаем: Вот ваши слова:
ЦитатаIQFun ()
надо просто поксорить все элементы массива,
После чего пишите противоречащие этому слова:
ЦитатаIQFun ()
(В нём не надо складывать всевозможные пары.
Вы вменяемый вообще? xor , или как вы выразились «поксорить» — это и есть сложение в кольце вычетов по модолю два. Постарайтесь хотя бы со второй попытки ответить на тот же вопрос: «чем отличается то что написал я от того что написали вы?» И пожалуйста внятно и по существу. ʎʞнɐнԑиɐнʎdǝфɔ ৭ꓕɐʚиhɐdoʚыʚ ꙕǝᥕʎ
Сообщение отредактировал Фигаро - Чт, 03.02.22, 20:59
Фигаро пишет "все возможные пары", IQFun, пишет "все элементы массива". Вы оба пишете разными словами об одном и том же? Предлагаю писать на родном языке: языке программирования, раз так трудно найти общий. Хотела поделиться опытом по поводу ИИ. Директор молзавода - молодой, продвинутый чел, имея автопарк и желая сократить расходы(читай уволить некоторых водителей), покупает крутую программу "Логистика". Однако, программа выдавая оптимальные маршруты доставки молока в торговые точки, никак не укладывается при имеющемся количестве персонала в необходимое время работы. И машин, и людей не достаточно! Мало вас, математиков, видимо проблема в этом)
Добавлено (03.02.22, 19:32) --------------------------------------------- P.s. я никак не могу понять - если сравнивать все возможные пары, зачем не использовать обычное математические равно, или вычитание с проверкой на ноль...а побитно все числа складывать попарно по модулю 2? Как этот xor работает с массивом? Алгоритм хоть бы опишите, пожалуйста
Сообщение отредактировал Vita - Чт, 03.02.22, 19:51
Фигаро пишет "все возможные пары", IQFun, пишет "все элементы массива". Вы оба пишете разными словами об одном и том же?
Да Вита, об одном и том же! Но вот IQFun не понимает этого, более того, по видимому он не понимает и того что пишет сам.
ЦитатаVita ()
Как этот xor работает с массивом?
Я конечно постараюсь доступно разъяснить о том что написал я и о том что это за xor, но не уверен что это получится, т.к. не знаю что вам знакомо а что нет.
Вот давайте все целые числа будем делить на 2, и смотреть какие остатки при этом получаются.Не трудно понять что у нас будут получаться в остатке либо 0, либо 1. Получается что все числа можно рассортировать на два множества, — множество чисел которые дают ноль в остатке при делении на 2, и множество чисел которые дают единицу в остатке при делении на два. Числа входящие в эти множества называют вычетами по модулю два, а сами эти множества обозначают следующим образом [0]2, [1]2, и называют классами вычетов по модулю 2.В арифметике остатков, вместо того чтобы складывать (или например умножать) числа из этих классов, можно просто сложить остатки.Например вместо того чтобы складывать 13 и 17 и искать какой остаток даёт сумма этих чисел при делении на два, мы просто можем сложить остатки.Число 13 даёт остаток 1 при делении на 2, и число 17 даёт остаток 1 при делении на два, значит сумма этих чисел даёт остаток 1+1=2, т.е. 0, т.к. 2 делится на 2 без остатка.Можем даже таблицу сложения соответствующую сделать:
Вот так лаконично выглядит таблица сложения всех целых чисел по модолю два.Можно так же и умножать эти остатки.В математике если над некими объектами можно осуществлять операции похожие на сложения (и обратимую к ней операцию) а так же операцию похожую на умножение, то говорят что относительно данных операций изучаемые элементы образуют конечное кольцо.Кольцо вычетов по модулю два обозначается Z/2Z.(На самом деле здесь выполняются все аксиомы поля, поэтому я бы мог обозначить это как GF(2), но я подумал IQFun не поймёт ничего, но в итоге он всё равно не понял).
Теперь думаю более ясно что написано в моём сообщении.
Теперь разберёмся с функцией xor.XOR, это и есть функция сложения по модулю два.Это функция встроена практически в любой язык программирования.В логике её называют «исключающее или» собственно от сюда и название функции.Сравните табличку сложения двух элементов по модулю 2 данную вверху и таблицу истинности для «исключающего или» так же для двух операндов:
Эта операция побитовая, т.е. она выполняется для каждого разряда.Чтобы вы не ввели в компьютер он каждый элемент кодирует в двоичный код.
Если вы введете некий массив чисел то компьютер будет оперировать ими в двоичной системе счисления.Пусть у нас есть два операнда например
001110001
и
001110001
Применяя к этим операндам функцию xor, — компьютер будет поразрядно складывать их (смотрите табличку сложения) , то есть произойдёт следующее:
Как видим если два операнда равны, то в итоге получится ноль, всегда, а если не равны, то ноля не получится ни при каких условиях.
Так вот если мы будем применять к массиву чисел функцию xor, то будут складываться все числа попарно, и в итоге мы выявим те которые в массиве присутствуют дважды и те которые в единственном экземпляре.
Теперь давайте перечитаем то что написал я:
ЦитатаФигаро ()
Переводим все числа в двоичную систему, складываем побитно все возможные пары в Z/2Z, если при сложении получается 0 то эти числа одинаковы их отбрасываем. Продолжаем пока не наткнемся на число которое при таком сложении с остальными не даёт 0, это и будет искомое число в данном массиве.
и то что написал IQFun:
ЦитатаIQFun ()
Ответ: надо просто поксорить все элементы массива, в результате получим искомое число. Потому что пары одинаковых чисел дадут в результате нули.
Как видим из всего выше описанного, разницы здесь нет никакой абсолютно, оба поста об одном и том же, но IQFun, с упорством достойным лучшего применения этого в упор не замечает. ʎʞнɐнԑиɐнʎdǝфɔ ৭ꓕɐʚиhɐdoʚыʚ ꙕǝᥕʎ
Сообщение отредактировал Фигаро - Чт, 03.02.22, 21:21
------------------------------------------ P.s. я никак не могу понять - если сравнивать все возможные пары, зачем не использовать обычное математические равно, или вычитание с проверкой на ноль...а побитно все числа складывать попарно по модулю 2? Как этот xor работает с массивом? Алгоритм хоть бы опишите, пожалуйста
Я понимаю таблицу истинности, понимаю как из логических элементов собрать схему исключающее ИЛИ, я не понимаю - ЗАЧЕМ, чем это упростит задачу попарного перебора и сравнения?
Сообщение отредактировал Vita - Чт, 03.02.22, 21:36