Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.98/55: Рейтинг темы: голосов - 55, средняя оценка - 4.98
Заблокирован

Как сделать из двух чисел третье, уникальное для любой комбинации первых двух?

03.07.2015, 10:25. Показов 12058. Ответов 35
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Hi
Есть два числа, допустим: int a и int b, как можно их "сопряч", то есть что - то с ними сделать, что бы получить третье число, уникальное для любого набора этих А и B. Причём порядок следования A и B так же важен.

То есть есть два числа:
1. Первое число (допустим типа int)
2. Второе число (допустим типа int)

Нужно получить любой третье число, допустим int c, которое бы не повторяется для любых других комбинаций и последовательностей исходных чисел.

Да, и самое главное, нужно это сделать с минимальным кол-вом операций, т.к. эти вычисления производятся очень и очень часто (миллиарды раз в секунду)

Казалось бы, что может быть проще:
int a = 3;
int b = 7;
взял, да умножил: int c = a * b = 3 * 7 = 21, но, если будет комбинация наоборот:
int a = 7;
int b = 3;
результат будет тот же, а исходные данные поменялись... И т.д. и тп.

Я пока вижу, как можно сделать это в три действия:
C++
1
int c = (a + b)*c;
но тут лишнее действие на мой взгляд...
может быть есть какая то хитрая процессорная инструкция для быстрого преобразования подобных вещей?
Может быть хитрый XOR или ещё что - то ?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
03.07.2015, 10:25
Ответы с готовыми решениями:

Вывести сумму двух первых чисел одномерного массива, равную сумме двух последних чисел
Дан массив (одномерный) четырёхзначных чисел, вывести сумму двух первых чисел, равных сумме двум последним числам.

В четырехзначном числе посчитать сумму первых двух и последних двух чисел
Как это можно реализовать в с++? Моя задача: На интервале найти все простые числа для каждого из которых сумма первой и второй цифры равна...

Из двух векторов, создать третий состоящий из повторяющихся чисел находящихся в первых двух.
из двух векторов, создать третий состоящий из повторяющихся чисел находящихся в первых двух то есть если если есть два вектора ...

35
Заблокирован
03.07.2015, 11:56  [ТС]
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Croessmah Посмотреть сообщение
Хмм, действительно разные. Но почему то на http://ideone.com одно, а у меня другое... Почему так?
И работает ли ваш способ для любой комбинации ?
Миниатюры
Как сделать из двух чисел третье, уникальное для любой комбинации первых двух?  
0
Неэпический
 Аватар для Croessmah
18150 / 10732 / 2067
Регистрация: 27.09.2012
Сообщений: 27,047
Записей в блоге: 1
03.07.2015, 12:22
Надеюсь, проект сохранили и построили перед запуком и во время построения ошибок не было? Компилятор какой?
1
Заблокирован
03.07.2015, 12:36  [ТС]
Цитата Сообщение от Croessmah Посмотреть сообщение
Компилятор какой?
А там на скрине видно - minGW.
Хмм, странное дело, попробовал собрать студийным компилятором (MSVS2013), стало всё как у вас на idode-е.
Значит mingGW - ерунда

Добавлено через 1 минуту
Вредный кошак, так что, ваш под мои задачи как бы подходит? То есть для любой комбинации будет уникальное число? Или всё таки лучше с хэшом замочорится ?
0
Модератор
Эксперт С++
 Аватар для zss
13795 / 10987 / 6492
Регистрация: 18.12.2011
Сообщений: 29,287
03.07.2015, 12:39
Предлагаю еще один.
По коду самый короткий вариант
C++
1
2
3
4
5
6
7
8
9
union A
{
    unsigned long long int r;
    unsigned int a[2];
};
...
A x;
x.a[0]=3;x.a[1]=7;
cout<<x.r;
1
Заблокирован
03.07.2015, 12:42  [ТС]
Цитата Сообщение от zss Посмотреть сообщение
x.a[0]=3;x.a[1]=7;
А где тот 'r' задаётся вообще? Или тот что - то со сдвигом в памяти самой структуры?

Ой.. это ж юнион :-)
Такс... А как тогда подобный код работает? Ты как бы просто соединяешь два инта в один 64-х битный и надеешься, что он получится уникальным? Но так ли это ?
0
Неэпический
 Аватар для Croessmah
18150 / 10732 / 2067
Регистрация: 27.09.2012
Сообщений: 27,047
Записей в блоге: 1
03.07.2015, 12:45
Butt-Head, у меня на mingw такой проблемы нет.

Добавлено через 1 минуту
Butt-Head, это не структура, это объединение. В данном случае r и a хранятся в одной области памяти и, соответственно, изменения в a изменят и r
1
Заблокирован
03.07.2015, 12:54  [ТС]
Цитата Сообщение от Croessmah Посмотреть сообщение
В данном случае r и a хранятся в одной области памяти и, соответственно, изменения в a изменят и r
ну я как бы правильно понимаю, что:
Цитата Сообщение от Butt-Head Посмотреть сообщение
Ты как бы просто соединяешь два инта в один 64-х битный и надеешься, что он получится уникальным? Но так ли это ?
Добавлено через 1 минуту
Цитата Сообщение от Croessmah Посмотреть сообщение
это объединение
Размер юниона на сколько я помню равен размеру максимального элемента и если записывается элемент меньшей размерности, то он пишется как бы в начало ?
0
Неэпический
 Аватар для Croessmah
18150 / 10732 / 2067
Регистрация: 27.09.2012
Сообщений: 27,047
Записей в блоге: 1
03.07.2015, 12:58
Butt-Head, первое число в старших 32-х битах, второе число - в младших. По сути, вы сохраняете два числа и "их позиции". Изменение чисел или их порядка даст другую комбинацию бит в двоичном коде. Само собой, числа должны быть из допустимого диапазона - 32 бита на число (либо знаковые, либо беззнаковы).
1
Модератор
Эксперт С++
 Аватар для zss
13795 / 10987 / 6492
Регистрация: 18.12.2011
Сообщений: 29,287
03.07.2015, 13:03
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream>
#include <iomanip>
using namespace std;
 
union A
{
    unsigned long long int r;
    unsigned int a[2];
};
 
int main()
{
    A x;
    x.a[0]=0X12345678;x.a[1]=0X9ABCDEF0;
    cout<<hex<<x.r<<endl;
    system("pause");
    return 0;
}
вывод
9ABCDEF012345678
1
Заблокирован
03.07.2015, 13:13  [ТС]
В общем всем спасибо, я понял, что оптимальный вариант - просто объединить два мелких числа в одно большое.
Цитата Сообщение от S_el Посмотреть сообщение
r=(a<<32)| b;
А вот это некоторыми компиляторами не понималось наверное потому, что тут и A и B изначально по 32 бита, то есть всё что справа идёт в рамках 32-х бит, а потом уже приводится к 64-х битному R. Вот если бы было что - то типа
C++
1
r=(a<<32)| (long long)b;
тогда бы всё сразу заработало!
Ещё раз всем спасибо!

Добавлено через 7 минут
Стоп! Ещё не всё чёрт побери
Один раз я таким макаром ID получу, но что, если мне нужно будет не основание уже этих 64-х битных ID получить ещё одно уникально ? Мне каждый раз нужно будет удваивать размерность? Хмм... вронг вэй ...
Как бы без удваивания размерности всё таки решить мою задачу? Может всё таки с хэшами всякими ?
0
Модератор
Эксперт С++
 Аватар для zss
13795 / 10987 / 6492
Регистрация: 18.12.2011
Сообщений: 29,287
03.07.2015, 14:21
Скорее в сторону архивации и сжатия данных типа zip, rar, gif,png и т.д.
1
Заблокирован
03.07.2015, 15:09  [ТС]
Цитата Сообщение от zss Посмотреть сообщение
Скорее в сторону архивации и сжатия данных типа zip, rar, gif,png и т.д.
А если допустить наличие некоторого третьего числа, которое бы дополняло это уникальное число (которое есть С в нашем случае и которое является хитрым сплетением А и B) ?
Тогда задача упроститься? Или опять придётся удваивать данные?
0
Почетный модератор
Эксперт С++
 Аватар для SatanaXIII
5851 / 2862 / 392
Регистрация: 01.11.2011
Сообщений: 6,906
03.07.2015, 15:52
Наверное я повторяюсь с предыдущими ораторами, но
Цитата Сообщение от Butt-Head Посмотреть сообщение
Казалось бы, что может быть проще:
int a = 3;
int b = 7;
взял, да умножил: int c = a * b = 3 * 7 = 21, но, если будет комбинация наоборот:
int a = 7;
int b = 3;
результат будет тот же, а исходные данные поменялись
Так результат и при вот этом будет таким же:
Цитата Сообщение от Butt-Head Посмотреть сообщение
Я пока вижу, как можно сделать это в три действия:
C++
1
int c = (a + b)*c;
Даже если мы первое число инвертируем побитно и проведем, скажем, XOR со вторым (что даст различие в порядке следования чисел), то не факт, что два других числа не дадут такое же результирующее. Тем более, что по мере роста чисел, при приближении к максимальному числу для данного типа, будут теряться старшие биты, что опять же даст одинаковое результирующее число для пары, у которой старшие биты не потеряны.

Данная задача из области хеширования. Надо искать решение там.

В общем виде ваша задача не решается.
1
Заблокирован
03.07.2015, 16:08  [ТС]
Цитата Сообщение от SatanaXIII Посмотреть сообщение
Данная задача из области хеширования. Надо искать решение там.
Хмм... Ну ок. Ну в теории ведь и хеши могут повторяться, там какая - то очень маленькая вероятность, но всё же она есть, верно ?
0
Диванный эксперт
Эксперт С++
 Аватар для Max Dark
2551 / 2065 / 971
Регистрация: 09.10.2013
Сообщений: 4,904
Записей в блоге: 4
03.07.2015, 16:20
в число разрядности n можно записать 2n уникальных значений
у вас есть 2 числа разрядности n и вам нужно для каждого сочетания этих чисел получить уникальный индификатор
количество вариантов этих сочетаний == 2n*2n==22*n
т.е. для уникального индификатора этого сочетания требуется 2*n бит
1
12 / 12 / 1
Регистрация: 11.01.2013
Сообщений: 150
20.05.2019, 17:37
Возьмите разность. Самое простое.
3 - 7 = -4
7 - 3 = 4
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
20.05.2019, 17:37

В случайном четырехзначном числе найти сумму двух первых чисел и произведение двух последних.
Привет всем! Нужна помощь. Написать вот такую вот программу. В случайном четырехзначном числе найти сумму двух первых чисел и...

Сосчитайте, сколько четырёхзначных чисел имеют одинаковые суммы двух первых и двух последних цифр
Сосчитайте, сколько четырёхзначных чисел имеют одинаковые суммы двух первых и двух последних цифр. Нужна блок-схема, программа, и её...

Среди чисел найти все, у которых сумма первых двух равна сумме последних двух
Помогите пожалуйста решить задание: среди четырехзначных чисел из интервала, заданного пользователем, найти все, у которых сумма первых...

Найти количество чисел, суммы двух первых и двух последних цифр которых различаются не более, чем на 2
Назовём натуральное пятизначное число N (10000&lt;=N &lt;= 99999) счастливым, если суммы двух его первых и двух последних цифр различаются не...

Найти количество четырёхзначных восьмеричных чисел, у которых суммы двух первых и двух последних цифр равны
Вопрос: Назовём натуральное число N (10008 &lt;= N &lt;= 77778) счастливым, если суммы двух первых и двух последних цифр его восьмеричной записи...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
36
Ответ Создать тему
Новые блоги и статьи
Копировать Windows на новый диск на UEFI
damix 17.10.2026
https:/ / uriesk. wordpress. com/ 2016/ 11/ 01/ move-window-10-to-ssd-on-a-uefi-dualboot-system-with-basic-linux-tools/ TL DR Вставляем диск, а старый подключаем через переходник, грузимся с лайва. . .
ИИ не может найти нужный язык в списке
Supersumestria 05.10.2026
Я ему даю вот такое изображение и прошу найти и подчеркнуть немецкий язык. Возвращает он вот это: https:/ / i. **********/ vqBWLe2. png Нужную строчку в 3й колонке просто выдумал. . Это. . .
Новая последняя моя музыка в SUNO
zorxor 05.10.2026
Здравствуйте, дорогие мои друзья! С большой радостью я хотел бы представить вам свою новую последнею музыку, которую сгенерировала мне по моей просьбе нейросеть SUNO. С уважением, zorxor. Это. . .
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js. В помощники взял Яндекс-Алису. Было создано три зала на разные интересы. исторические и ретро сериал Хичкок. . .
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru