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

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

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

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

03.07.2015, 10:25. Просмотров 2038. Ответов 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++
Определить, равна ли сума двух первых цифр четирезначного числа суме двух последних

34
zss
Модератор
Эксперт С++
6818 / 6380 / 2131
Регистрация: 18.12.2011
Сообщений: 16,742
Завершенные тесты: 1
03.07.2015, 10:45 #2
Уникально будет только, если байты чисел объединить.
Например так:
C++
1
2
3
unsigned long long int r;
unsigned int a,b;
r=(a<<32)| b;
1
Butt-Head
Заблокирован
03.07.2015, 11:06  [ТС] #3
Цитата Сообщение от zss Посмотреть сообщение
Уникально будет только, если байты чисел объединить.
не понял, а зачем A сдвигать ? (<<32) ?

Добавлено через 36 секунд
Да и потом, будет ли это уникально для : a = 3, b = 7 ; a = 7, b = 3 ...
0
HighPredator
5634 / 1949 / 369
Регистрация: 10.12.2010
Сообщений: 5,650
Записей в блоге: 3
03.07.2015, 11:14 #4
Butt-Head, можете вменяемый пример привести?
0
Butt-Head
Заблокирован
03.07.2015, 11:14  [ТС] #5
Цитата Сообщение от zss Посмотреть сообщение
Уникально будет
Не, так уникально не будет.
берёшь:
int a = 3;
int b = 7;
потом берёшь
int a = 7;
int b = 3;
и получаешь тот же результат, а последовательность как я говорил - важна
0
Croessmah
Ушел
Эксперт CЭксперт С++
13713 / 7963 / 909
Регистрация: 27.09.2012
Сообщений: 19,602
Записей в блоге: 3
Завершенные тесты: 1
03.07.2015, 11:16 #6
Butt-Head, не будет такого же результата, потому что в первом случае 3 "уедет" на 32 бита "влево", а во втором - семерка "уедет" влево на 32 бита
0
Butt-Head
Заблокирован
03.07.2015, 11:18  [ТС] #7
Цитата Сообщение от HighPredator Посмотреть сообщение
можете вменяемый пример привести?
Могу, у меня есть два числа:
Число 1: int a;
Число 2: int b;

Нужно получить такое число 3, которое бы было уникально для каждой из любых комбинаций a и b.

допустим:
a = 3;
b = 7;
или
a = 7;
b = 3;
или
a = 3;
b = -3;
или
a = -3;
b = 3;
или
a = 10
b = 77
и тд ... Любые числа.
Так вот. Мне нужно как - то на основе A и B получать на каждую ихнюю комбинацию - уникальное значение какое - то, которое я буду в дальнейшем как ID использовать ...
0
HighPredator
5634 / 1949 / 369
Регистрация: 10.12.2010
Сообщений: 5,650
Записей в блоге: 3
03.07.2015, 11:21 #8
Теперь понял. Решение в лоб: берете два числа, кладете их последовательно в двухинтовый буфер, берете от него md5 хэш. Будет вам уникальное значение.
0
Butt-Head
Заблокирован
03.07.2015, 11:23  [ТС] #9
Цитата Сообщение от Croessmah Посмотреть сообщение
не будет
Не будет!
C++
1
2
3
4
5
6
7
    unsigned long long int r;
    int a = 3;
    int b = 7;
    r=(a<<32)| b;
 
    std::bitset<64> bs(r);
    std::cout << bs.to_string() << std::endl;
OUT: "0000000000000000000000000000000000000000000000000000000000000111"

C++
1
2
3
4
5
6
7
    unsigned long long int r;
    int a = 7;
    int b = 3;
    r=(a<<32)| b;
 
    std::bitset<64> bs(r);
    std::cout << bs.to_string() << std::endl;
OUT: "0000000000000000000000000000000000000000000000000000000000000111"

Добавлено через 1 минуту
Цитата Сообщение от HighPredator Посмотреть сообщение
Решение в лоб: берете два числа, кладете их последовательно в двухинтовый буфер, берете от него md5 хэш.
Ой.. это ж сколько процессорных инструкций ... Всё будет тормозить ... Мне нужн ос минимальным кол-вом операций ...

А разве просто вот так не сработает:
C++
1
2
3
4
int a;
int b;
//...
int c = (a+b)*c;
?
0
HighPredator
5634 / 1949 / 369
Регистрация: 10.12.2010
Сообщений: 5,650
Записей в блоге: 3
03.07.2015, 11:26 #10
Вам шашечки, или ехать? У вас фигурировало ключевое требование -- уникальность. Для хэшей уникальность доказана математически. Любое другое решение потребует строгого доказательства того факта, что не существует пары c и d, для которых значение бы совпало. Найдете такое -- хорошо. Как и сказал, предложенное решение -- в лоб.
1
S_el
2127 / 1655 / 311
Регистрация: 15.12.2013
Сообщений: 6,538
03.07.2015, 11:28 #11
Butt-Head,
должно работать,вот так проверьте:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#include <iostream>
#include<bitset>
#include<string>
 
int main() {
    std::cout<<sizeof(int)<<std::endl;
    {
    unsigned long long int r;
    int a = 3;
    int b = 7;
    r=(a<<32)| b;
 
    std::bitset<64> bs(r);
    std::cout << bs.to_string() << std::endl;
    }
    {
    unsigned long long int r;
    int a = 7;
    int b = 3;
    r=(a<<32)| b;
 
    std::bitset<64> bs(r);
    std::cout << bs.to_string() << std::endl;
        
        
    }
    return 0;
}
Добавлено через 34 секунды
HighPredator, куда уж проще - в строку запихнуть и спец символом разделить

Добавлено через 53 секунды
Цитата Сообщение от Butt-Head Посмотреть сообщение
А разве просто вот так не сработает:
нет.Что такое c в вашем случае?
2
HighPredator
5634 / 1949 / 369
Регистрация: 10.12.2010
Сообщений: 5,650
Записей в блоге: 3
03.07.2015, 11:31 #12
Цитата Сообщение от S_el Посмотреть сообщение
в строку запихнуть и спец символом разделить
Ну тоже вариант

Не по теме:

Я просто за md5 потому, что такой хэш отлично парсится по значению на hex-блоки (отлично для индексации в ассоциативных массивах).

0
Butt-Head
Заблокирован
03.07.2015, 11:37  [ТС] #13
Цитата Сообщение от S_el Посмотреть сообщение
должно работать,вот так проверьте:
Я же уже проверял и сказал, что не работает. См скрин.
А вот мой способ как раз таки работает, можете объяснить, почему вы говорите, что мой простой способ не может работать и в каких случаях?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
{
        unsigned long long int r;
        int a = 3;
        int b = 7;
        int c = (a + b)*a;
 
        std::cout << c << std::endl;
        //RESULT: 30
    }
    {
        unsigned long long int r;
        int a = 7;
        int b = 3;
        int c = (a + b)*a;
 
        std::cout << c << std::endl;
        //RESULT: 70
    }
0
Миниатюры
Как сделать из двух чисел третье, уникальное для любой комбинации первых двух?  
S_el
2127 / 1655 / 311
Регистрация: 15.12.2013
Сообщений: 6,538
03.07.2015, 11:37 #14
Цитата Сообщение от HighPredator Посмотреть сообщение
Я просто за md5 потому, что такой хэш отлично парсится по значению на hex-блоки (отлично для индексации в ассоциативных массивах).
Да,к тому-же хэш будет более универсальным решением,если условие на входные параметры поменяется.

Butt-Head, а какую вы задачу решаете?
1
Butt-Head
Заблокирован
03.07.2015, 11:39  [ТС] #15
Цитата Сообщение от S_el Посмотреть сообщение
куда уж проще - в строку запихнуть
Оверхэд по производительности

Добавлено через 1 минуту
Цитата Сообщение от S_el Посмотреть сообщение
а какую вы задачу решаете?
Есть дискретный звуковой сигнал, ну простой WAV файл.
Мне нужно на каждую выборку из двух отсчётов получить уникальный ID.
0
03.07.2015, 11:39
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.07.2015, 11:39
Привет! Вот еще темы с ответами:

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

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