Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 5.00
Butt-Head
Заблокирован
#1

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

03.07.2015, 10:25. Просмотров 1580. Ответов 34
Метки нет (Все метки)

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
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
03.07.2015, 10:25
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Как сделать из двух чисел третье, уникальное для любой комбинации первых двух? (C++):

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

Работа с битами, вывести на экран все комбинации двух единиц и двух нулей - C++
Здравствуйте, не могу решить такую задачу: К примеру есть 4 бита: 1010. Нужно функция которая выведет на экран все комбинации двух единиц...

Через указатели посчитать сумму двух чисел и записать в третье - C++
Через указатели посчитать сумму двух чисел и записать в третье. Делать через функции.

Программа с указателями. Из двух введенных множеств чисел составить третье множество - C++
Из двух введенных множеств чисел составить третье множество, элементами которого будут совпадающие числа заданных множеств.

Перебрать все возможные комбинации трех чисел от нуля до двух - C++
Здравствуйте, помогите, пожалуйста, разобраться с темой (лучше всего написать код, а то на словах вроде понятно, но код всё же лучше) ...

Определить, равна ли сума двух первых цифр четирезначного числа суме двух последних - C++
Определить, равна ли сума двух первых цифр четирезначного числа суме двух последних

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
HighPredator
5542 / 1848 / 345
Регистрация: 10.12.2010
Сообщений: 5,450
Записей в блоге: 2
03.07.2015, 11:43 #16
Цитата Сообщение от Butt-Head Посмотреть сообщение
А вот мой способ как раз таки работает, можете объяснить, почему вы говорите, что мой простой способ не может работать и в каких случаях?
А сами не видите? Ну ок, вот у вас a = 3, b = 7. Пусть есть c = 2, d = 13. Угадайте, чему равно значение по вашей формуле? Уже не уникально.
0
Croessmah
Эксперт CЭксперт С++
13214 / 7486 / 842
Регистрация: 27.09.2012
Сообщений: 18,403
Записей в блоге: 3
Завершенные тесты: 1
03.07.2015, 11:43 #17
Не будет
Тыц: http://ideone.com/Hs3PgJ
0
HighPredator
5542 / 1848 / 345
Регистрация: 10.12.2010
Сообщений: 5,450
Записей в блоге: 2
03.07.2015, 11:46 #18
Цитата Сообщение от Butt-Head Посмотреть сообщение
Мне нужно на каждую выборку из двух отсчётов получить уникальный ID.
ИМХО, для двух отсчетов такая задача сама по себе оверхед.

Добавлено через 20 секунд
Цель какая преследуется для сего?
0
Croessmah
Эксперт CЭксперт С++
13214 / 7486 / 842
Регистрация: 27.09.2012
Сообщений: 18,403
Записей в блоге: 3
Завершенные тесты: 1
03.07.2015, 11:53 #19
А вот мой способ как раз таки работает, можете объяснить, почему вы говорите, что мой простой способ не может работать и в каких случаях?
Возьмите другие наборы чисел и увидите, что не работает. Пример:
(4+6)*4 = 40
(5+3)*5 = 40

Развеилась теория гениальности?
1
Butt-Head
Заблокирован
03.07.2015, 11:54  [ТС] #20
Цитата Сообщение от HighPredator Посмотреть сообщение
А сами не видите?
Да, действительно ...

Цитата Сообщение от HighPredator Посмотреть сообщение
ИМХО, для двух отсчетов такая задача сама по себе оверхед.
Не, не оверхэд, да и потом всё на GPGPU
Цитата Сообщение от HighPredator Посмотреть сообщение
Цель какая преследуется для сего?
система подлинного искусственного интеллекта
0
Butt-Head
Заблокирован
03.07.2015, 11:56  [ТС] #21
Цитата Сообщение от Croessmah Посмотреть сообщение
Хмм, действительно разные. Но почему то на http://ideone.com одно, а у меня другое... Почему так?
И работает ли ваш способ для любой комбинации ?
0
Миниатюры
Как сделать из двух чисел третье, уникальное для любой комбинации первых двух?  
Croessmah
Эксперт CЭксперт С++
13214 / 7486 / 842
Регистрация: 27.09.2012
Сообщений: 18,403
Записей в блоге: 3
Завершенные тесты: 1
03.07.2015, 12:22 #22
Надеюсь, проект сохранили и построили перед запуком и во время построения ошибок не было? Компилятор какой?
1
Butt-Head
Заблокирован
03.07.2015, 12:36  [ТС] #23
Цитата Сообщение от Croessmah Посмотреть сообщение
Компилятор какой?
А там на скрине видно - minGW.
Хмм, странное дело, попробовал собрать студийным компилятором (MSVS2013), стало всё как у вас на idode-е.
Значит mingGW - ерунда

Добавлено через 1 минуту
Вредный кошак, так что, ваш под мои задачи как бы подходит? То есть для любой комбинации будет уникальное число? Или всё таки лучше с хэшом замочорится ?
0
zss
Модератор
Эксперт С++
6382 / 5947 / 1927
Регистрация: 18.12.2011
Сообщений: 15,264
Завершенные тесты: 1
03.07.2015, 12:39 #24
Предлагаю еще один.
По коду самый короткий вариант
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
Butt-Head
Заблокирован
03.07.2015, 12:42  [ТС] #25
Цитата Сообщение от zss Посмотреть сообщение
x.a[0]=3;x.a[1]=7;
А где тот 'r' задаётся вообще? Или тот что - то со сдвигом в памяти самой структуры?

Ой.. это ж юнион :-)
Такс... А как тогда подобный код работает? Ты как бы просто соединяешь два инта в один 64-х битный и надеешься, что он получится уникальным? Но так ли это ?
0
Croessmah
Эксперт CЭксперт С++
13214 / 7486 / 842
Регистрация: 27.09.2012
Сообщений: 18,403
Записей в блоге: 3
Завершенные тесты: 1
03.07.2015, 12:45 #26
Butt-Head, у меня на mingw такой проблемы нет.

Добавлено через 1 минуту
Butt-Head, это не структура, это объединение. В данном случае r и a хранятся в одной области памяти и, соответственно, изменения в a изменят и r
1
Butt-Head
Заблокирован
03.07.2015, 12:54  [ТС] #27
Цитата Сообщение от Croessmah Посмотреть сообщение
В данном случае r и a хранятся в одной области памяти и, соответственно, изменения в a изменят и r
ну я как бы правильно понимаю, что:
Цитата Сообщение от Butt-Head Посмотреть сообщение
Ты как бы просто соединяешь два инта в один 64-х битный и надеешься, что он получится уникальным? Но так ли это ?
Добавлено через 1 минуту
Цитата Сообщение от Croessmah Посмотреть сообщение
это объединение
Размер юниона на сколько я помню равен размеру максимального элемента и если записывается элемент меньшей размерности, то он пишется как бы в начало ?
0
Croessmah
Эксперт CЭксперт С++
13214 / 7486 / 842
Регистрация: 27.09.2012
Сообщений: 18,403
Записей в блоге: 3
Завершенные тесты: 1
03.07.2015, 12:58 #28
Butt-Head, первое число в старших 32-х битах, второе число - в младших. По сути, вы сохраняете два числа и "их позиции". Изменение чисел или их порядка даст другую комбинацию бит в двоичном коде. Само собой, числа должны быть из допустимого диапазона - 32 бита на число (либо знаковые, либо беззнаковы).
1
zss
Модератор
Эксперт С++
6382 / 5947 / 1927
Регистрация: 18.12.2011
Сообщений: 15,264
Завершенные тесты: 1
03.07.2015, 13:03 #29
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
Butt-Head
Заблокирован
03.07.2015, 13:13  [ТС] #30
В общем всем спасибо, я понял, что оптимальный вариант - просто объединить два мелких числа в одно большое.
Цитата Сообщение от 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
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.07.2015, 13:13
Привет! Вот еще темы с ответами:

Из двух квадратных матриц создать третью, перемножив элементы первых двух согласно условию - C++
Для двух квадратных матриц нужно создать третюю матрицу, элементы которой которой должны равняться произведению элементов соответствующей...

Вывести на экран элементы массива, сумма первых двух цифр равна сумме двух последних - C++
//Массив из n четырехзначных натуральных чисел. //Вывести па экран только те, у которых сумма первых двух цифр равна сумме двух...

Вывести на экран только те, у которых сумма первых двух цифер равна сумме двух последних. - C++
Дан массив из n четырёхзначных натуральных чисел. Вывести на экран только те, у которых сумма первых двух цифер равна сумме двух последних.

Найти все четырехзначные числа у которых сумма первых двух цифр равна сумме двух последних - C++
найти все четырехзначные числа у которых сумма первых двух цифр равна сумме двух последних.


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
03.07.2015, 13:13
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru