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

Элемент в массиве через двоичную систему поиска

10.02.2012, 11:35. Показов 1437. Ответов 15
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Нужно найти элемент в массиве через двоичную систему поиска и поставить счетчик, который вычислит количество операций сравнений.
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
10.02.2012, 11:35
Ответы с готовыми решениями:

перевод в двоичную систему через классы
Помогите решить задачу используя классы. Дано натуральное число Р. Переведите его в двоичную систему счисления.

Юникод в двоичную систему
Добрый день! Подскажите, как из файла прочитать знак (на русском языке), после чего напечатать на экране представление знака в двоичной...

Задача на двоичную систему
Необходимо вывести в консоль все положительные четырехзначные числа, в записи которых нет 7. Понимаю что скорее всего надо использовать...

15
Автор FAQ
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
10.02.2012, 17:24
Цитата Сообщение от Тан10шка Посмотреть сообщение
Нужно найти элемент в массиве через двоичную систему поиска и поставить счетчик, который вычислит количество операций сравнений.
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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
#include <iostream>
#include <cmath>
#include <ctime>
using namespace std;
 
int getBinVal(int val)
{
    int binRew = val - 2*(val/2);
    while(0 < (val /= 2))
    {
        binRew *= 10;
        binRew += val - 2*(val/2);
    }
    //Òåïåðü "ïåðåâîðà÷èâàåì" äâîè÷íîå çåðêàëî ÷èñëà
    int binVal = binRew % 10;
    while(0 < (binRew /= 10))
    {
        binVal *= 10;
        binVal += binRew % 10;
    }
    return binVal;
}
 
int main()
{
    int * arr = 0;
    int i, n, binMask, count;
    time_t t;
    while(true)
    {
        srand(time(&t));//×òîáû îò èòåðàöèè ê èòåðàöèè ñëó÷àéíûå ÷èñëà íå ïîâòîðÿëèñü
        cout<<"Enter num of elements : ";cin>>n;
        if(!(arr = new int[n]))
            cout<<"Allocation memory error\n";
        else
        {
            count = 0;
            for(i = 0; i < n; i++)
                cout<<(arr[i] = rand()%256)<<" ";
            cout<<"\nEnter binary mask : ";cin>>binMask;
            for(i = 0; i < n; i++)
            {
                if(getBinVal(arr[i]) == binMask)
                {
                    cout<<"arr["<<i + 1<<"] = "<<arr[i]<<endl;
                    count++;
                }
            }
            delete [] arr;
        }
        arr = 0;
    }
    system("pause");
    return 0;
}
Алгоритм нахождения двоичного числа на скрине
Миниатюры
Элемент в массиве через двоичную систему поиска   Элемент в массиве через двоичную систему поиска  
0
 Аватар для I.M.
576 / 559 / 47
Регистрация: 16.12.2011
Сообщений: 1,389
10.02.2012, 17:28
Хм, желательно пояснение от ТС. Может быть имелся в виду бинарный поиск в отсортированном массиве (хотя про отсортированность не было ни слова...)?
0
10.02.2012, 17:36

Не по теме:

Цитата Сообщение от I.M. Посмотреть сообщение
(хотя про отсортированность не было ни слова...)?
- I.M., а откуда отсортированность вообще взялась???=-O

0
10.02.2012, 17:41

Не по теме:

Не более, чем предположение:) Ведь если трактовать условие как "реализуйте-ка бинарный поиск", то нужно сортировать массив перед поиском.

0
10.02.2012, 17:44

Не по теме:

Цитата Сообщение от I.M. Посмотреть сообщение
то нужно сортировать массив перед поиском.
- =-O есть массив, есть число в двоичном представлении binMask, нужно каждый элемент массива перевести в двоичное и сравнить с binMask, вот и всё...

0
 Аватар для I.M.
576 / 559 / 47
Регистрация: 16.12.2011
Сообщений: 1,389
10.02.2012, 17:57
Возможно, мы говорим о разных вещах, именуя их одинаково. Я говорю об этом - Бинарный поиск.
При реализации этого алгоритма актуально и другое требование ТС -
поставить счетчик, который вычислит количество операций сравнений
Т.е. счетчик выдаст число шагов, за которое алгоритм нашел искомый элемент.
Но, повторюсь, это не более, чем предположение. Вполне возможно, что вы уже верно решили поставленную задачу.
0
Автор FAQ
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
10.02.2012, 17:58
Тан10шка,
Цитата Сообщение от I.M. Посмотреть сообщение
поставить счетчик, который вычислит количество операций сравнений
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
count++;
- я забыл в cout вывести
0
1406 / 648 / 135
Регистрация: 11.08.2011
Сообщений: 2,299
Записей в блоге: 2
10.02.2012, 18:07
Цитата Сообщение от Тан10шка Посмотреть сообщение
Элемент в массиве через двоичную систему поиска
Здесь binary search, точно. Т.к. иначе билеберда получается.
0
0 / 0 / 0
Регистрация: 13.01.2012
Сообщений: 7
11.02.2012, 11:36  [ТС]
Спасибо!!!

Проблема в том,что точного задания я так и не получила.
Но я думаю,что бинарный поиск ето именно то
0
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
 Аватар для easybudda
12843 / 7592 / 1766
Регистрация: 25.07.2009
Сообщений: 13,973
11.02.2012, 18:07
Цитата Сообщение от Dani Посмотреть сообщение
Здесь binary search, точно. Т.к. иначе билеберда получается.
Если телепатические способности Dani не подвели и больше никаких уточнений не придвидится, то и так сойдёт:
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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
 
/* понадобится для сортировки */
int asccmp(const void * a, const void * b){
    return *(int*)a - *(int*)b;
}
 
/* заполнение массива случайными числами */
void rndfill(int * arr, size_t size){
    while ( size-- )
        *arr++ = rand() % 10;
}
 
/* вывод на экран */
void dump(const int * arr, size_t size){
    while ( size-- )
        printf("%d%c", *arr++, ( size ) ? ' ' : '\n');
}
 
/* возвращает указатель на последнее найденное значение или NULL, counter - счётчик */
int * binsearch(const int * arr, size_t size, const int val, int * counter){
    const int * middle = arr + size / 2; /* указатель на середину массива */
    *counter += 1; /* отметились :) */
 
    if ( middle > arr ){ /* если элементов больше одного */
        if ( *(arr + size - 1) == val ) /* последний элемент */
            return (int*)(arr + size - 1);
        if ( *middle == val ) /* средний */
            return (int*)middle;
        if ( *middle > val ) /* искомый элемент между первым и средним */
            return binsearch(arr, middle - arr, val, counter);
        return binsearch(middle, size - (middle - arr), val, counter); /* в другом случае */
    }
    if ( *arr == val ) /* если нашли в начале массива */
        return (int*)arr;
        
    /* не нашли */
    return NULL;
}
 
int main(void){
    int * arr, val, * found;
    size_t size, counter;
    
    srand(time(NULL)); /* это чтобы при каждом запуске программы циферки разные были */
    
    while ( printf("Number of elements: ") && scanf("%u", &size) == 1 && size && printf("Value to search: ") && scanf("%d", &val) == 1 ){
        /* создаём и заполняем массив */
        if ( ! ( arr = (int*)malloc(sizeof(int) * size) ) ){
            perror("malloc");
            exit(1);
        }
        
        rndfill(arr, size);
        qsort(arr, size, sizeof(int), asccmp);
        printf("Array:\n");
        dump(arr, size);
        
        /* ищем элемент */
        counter = 0;
        if ( found = binsearch(arr, size, val, &counter) )
            printf("Last value %d found at pos %u with %u attempt(s)\n", val, found - arr + 1, counter);
        else
            printf("Can't find value %d after %u attempt(s)\n", val, counter);
        
        /* удаляем массив */
        free(arr);
    }
    
    exit(0);
}
0
0 / 0 / 0
Регистрация: 13.01.2012
Сообщений: 7
11.02.2012, 19:30  [ТС]
Большое спасибо всем!!!!
ОООООчеьнь помогли!!!!!!!!!
0
35 / 35 / 8
Регистрация: 22.05.2010
Сообщений: 107
12.02.2012, 12:12
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение

Не по теме:

- =-O есть массив, есть число в двоичном представлении binMask, нужно каждый элемент массива перевести в двоичное и сравнить с binMask, вот и всё...

Это самый обыкновенный ПОСЛЕДОВАТЕЛЬНЫЙ поиск
0
12.02.2012, 12:23

Не по теме:

vladislavchick, не занимайся офтопом...

0
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
 Аватар для easybudda
12843 / 7592 / 1766
Регистрация: 25.07.2009
Сообщений: 13,973
12.02.2012, 14:47
-=ЮрА=-, ну по сути-то он прав, это действительно последовательный поиск, да ещё и с непонятным геморроем из перевода чисел в двоичный вид. Для полноты ощущений их бы ещё в лексикографическом порядке сравнивать...

Нашёл у себя в архивах маргинальную функцию
C
1
2
3
4
int * binsearch(int val, int * arr, int cnt){
    int * middle = arr + cnt / 2;
    return ( middle > arr ) ? ( *middle > val ) ? binsearch(val, arr, middle - arr) : binsearch(val, middle, cnt + arr - middle) : ( *middle == val ) ? middle : NULL;
}
всё-таки надо проще быть...
0
12.02.2012, 15:09
Лучший ответ Сообщение было отмечено как решение

Решение

Не по теме:

Ну значит я неверно воспринял задание, ТС удовлетворилась, а больше ничего и не надо:)

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
12.02.2012, 15:09
Помогаю со студенческими работами здесь

Перевод в двоичную систему!
Здравствуйте, задание перевести флоат в двоичный код с мантисой порядком и всем таким, я там уже придумал алгоритм, но запнулся в самом...

Перевод в двоичную систему
Есть такой рабочий код #include &lt;iostream&gt; #include &lt;locale.h&gt; using namespace std; int main(void) { setlocale(LC_ALL,...

Перевод в двоичную систему
Здравствуйте, написал алгоритм перевода введённого числа в двоичную систему. Проблема в том, что он записывает обратный порядок,...

Перевод с десятичной в двоичную систему
Здравствуйте,нужно написать програму (только чистый Borland C), которая переводит числа из десятичных в двоичные..!

Не получается перевести в двоичную систему
Требуется перевести в двоичную систему счисления, но потом некоторые переменные меняют своё значение. У меня CodeBlocks. #include...


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

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Новые блоги и статьи
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а привычная функция main(). . .
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
Модель сукцессии микоризы
anaschu 24.01.2026
Решили писать научную статью с неким РОманом
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь(не выше 3-го порядка) постоянного тока с элементами R, L, C, k(ключ), U, E, J. Программа находит переходные токи и напряжения на элементах схемы классическим методом(1 и 2 з-ны. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru