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

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

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

Author24 — интернет-сервис помощи студентам
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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
03.07.2015, 10:25
Ответы с готовыми решениями:

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

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

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

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

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

Добавлено через 36 секунд
Да и потом, будет ли это уникально для : a = 3, b = 7 ; a = 7, b = 3 ...
0
6045 / 2160 / 753
Регистрация: 10.12.2010
Сообщений: 6,005
Записей в блоге: 3
03.07.2015, 11:14 4
Butt-Head, можете вменяемый пример привести?
0
Заблокирован
03.07.2015, 11:14  [ТС] 5
Цитата Сообщение от zss Посмотреть сообщение
Уникально будет
Не, так уникально не будет.
берёшь:
int a = 3;
int b = 7;
потом берёшь
int a = 7;
int b = 3;
и получаешь тот же результат, а последовательность как я говорил - важна
0
Неэпический
17870 / 10635 / 2054
Регистрация: 27.09.2012
Сообщений: 26,736
Записей в блоге: 1
03.07.2015, 11:16 6
Butt-Head, не будет такого же результата, потому что в первом случае 3 "уедет" на 32 бита "влево", а во втором - семерка "уедет" влево на 32 бита
0
Заблокирован
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
6045 / 2160 / 753
Регистрация: 10.12.2010
Сообщений: 6,005
Записей в блоге: 3
03.07.2015, 11:21 8
Теперь понял. Решение в лоб: берете два числа, кладете их последовательно в двухинтовый буфер, берете от него md5 хэш. Будет вам уникальное значение.
0
Заблокирован
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
6045 / 2160 / 753
Регистрация: 10.12.2010
Сообщений: 6,005
Записей в блоге: 3
03.07.2015, 11:26 10
Вам шашечки, или ехать? У вас фигурировало ключевое требование -- уникальность. Для хэшей уникальность доказана математически. Любое другое решение потребует строгого доказательства того факта, что не существует пары c и d, для которых значение бы совпало. Найдете такое -- хорошо. Как и сказал, предложенное решение -- в лоб.
1
2443 / 1841 / 406
Регистрация: 15.12.2013
Сообщений: 8,238
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
6045 / 2160 / 753
Регистрация: 10.12.2010
Сообщений: 6,005
Записей в блоге: 3
03.07.2015, 11:31 12
Цитата Сообщение от S_el Посмотреть сообщение
в строку запихнуть и спец символом разделить
Ну тоже вариант

Не по теме:

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

0
Заблокирован
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
2443 / 1841 / 406
Регистрация: 15.12.2013
Сообщений: 8,238
03.07.2015, 11:37 14
Цитата Сообщение от HighPredator Посмотреть сообщение
Я просто за md5 потому, что такой хэш отлично парсится по значению на hex-блоки (отлично для индексации в ассоциативных массивах).
Да,к тому-же хэш будет более универсальным решением,если условие на входные параметры поменяется.

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

Добавлено через 1 минуту
Цитата Сообщение от S_el Посмотреть сообщение
а какую вы задачу решаете?
Есть дискретный звуковой сигнал, ну простой WAV файл.
Мне нужно на каждую выборку из двух отсчётов получить уникальный ID.
0
6045 / 2160 / 753
Регистрация: 10.12.2010
Сообщений: 6,005
Записей в блоге: 3
03.07.2015, 11:43 16
Цитата Сообщение от Butt-Head Посмотреть сообщение
А вот мой способ как раз таки работает, можете объяснить, почему вы говорите, что мой простой способ не может работать и в каких случаях?
А сами не видите? Ну ок, вот у вас a = 3, b = 7. Пусть есть c = 2, d = 13. Угадайте, чему равно значение по вашей формуле? Уже не уникально.
0
Неэпический
17870 / 10635 / 2054
Регистрация: 27.09.2012
Сообщений: 26,736
Записей в блоге: 1
03.07.2015, 11:43 17
Не будет
Тыц: http://ideone.com/Hs3PgJ
0
6045 / 2160 / 753
Регистрация: 10.12.2010
Сообщений: 6,005
Записей в блоге: 3
03.07.2015, 11:46 18
Цитата Сообщение от Butt-Head Посмотреть сообщение
Мне нужно на каждую выборку из двух отсчётов получить уникальный ID.
ИМХО, для двух отсчетов такая задача сама по себе оверхед.

Добавлено через 20 секунд
Цель какая преследуется для сего?
0
Неэпический
17870 / 10635 / 2054
Регистрация: 27.09.2012
Сообщений: 26,736
Записей в блоге: 1
03.07.2015, 11:53 19
А вот мой способ как раз таки работает, можете объяснить, почему вы говорите, что мой простой способ не может работать и в каких случаях?
Возьмите другие наборы чисел и увидите, что не работает. Пример:
(4+6)*4 = 40
(5+3)*5 = 40

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

Цитата Сообщение от HighPredator Посмотреть сообщение
ИМХО, для двух отсчетов такая задача сама по себе оверхед.
Не, не оверхэд, да и потом всё на GPGPU
Цитата Сообщение от HighPredator Посмотреть сообщение
Цель какая преследуется для сего?
система подлинного искусственного интеллекта
0
03.07.2015, 11:54
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
03.07.2015, 11:54
Помогаю со студенческими работами здесь

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru