Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
 Аватар для Gubila_2000
7 / 3 / 3
Регистрация: 07.11.2014
Сообщений: 218
Записей в блоге: 1

Зацикливание при сравнении двоичных чисел

11.04.2015, 14:02. Показов 756. Ответов 4
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
На вход идет текстовый файл с 1 целым числом.

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

например дано число 19 - (10011)

10011
11001
11100 (28)
01110
00111
10011

в выходной файл вывести максимальное десятичное число.

У меня возникает проблема в том, что когда я сравниваю массив после сдвига с массивом изначальным, у меня все зацикливается.

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
#include <stdio.h>
#include <math.h>
#include <iostream>
int main()
{
    unsigned short bin0[16], bin1[16], i=0, n, k, p=0;
    int num, max;
    FILE *f;
 
    f = fopen("INPUT.TXT", "r");
    fscanf(f, "%d", &num);
    fclose(f);
 
    max=num;
    for (i=0; i<16; i++)
    {
        bin0[i]=0;
        bin1[i]=0;
    }
    i=16;
 
    while (num!=0)
    {
        k=num%2;
        if (k==0) {bin0[i]=0; bin1[i]=0;}
        else {bin0[i]=1; bin1[i]=1;}
        num/=2;
        i--;
    }
    n=i+1;
 
    while (p!=1)
    {//сдвиг вправо
        k=bin1[16];
        for (i=16; i>n; i--)
            bin1[i]=bin1[i-1];
        bin1[16]=k;
        
        //перевод в десятичную
        num=0;
        i=0;
        for (k=16; k>=n; k--)
        {
            num+=bin1[k]*pow(2,i);
            i++;
        }
    
        if (num>max) max=num;
        //сравнение - ЗДЕСЬ ЗАЦИКЛИВАЕТСЯ
        p=0;
        for (i=n; i<=16; i++)
        {
            if (bin0[i]==bin1[i]) {p=1;}
            else {p=0; break;}
        }
        
        
    }
    
    //просто вывод в консоли для проверки
    for (i=n; i<=16; i++)
    {
        printf("%d", bin1[i]);
    }
    
    printf("\n%d\n",num);
    system("pause");
    return 0;
}
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
11.04.2015, 14:02
Ответы с готовыми решениями:

Зацикливание при сравнении строк
Добрый вечер. У меня возникла проблема при сравнивании строк, после сравнивания происходит расчет по циклу и далее по идее должно...

Ошибка при сравнении символов
1) НЕ могу понять в чем ошибка при сравнении символов вот пример одной: Энтропия.cpp(18): error C2446: ==: нет преобразования...

Ошибка при сравнении типа char
#include &lt;cstdlib&gt; #include &lt;iostream&gt; #include &lt;fstream&gt; #include &lt;string&gt; using namespace std; int main(int argc, char...

4
Форумчанин
Эксперт CЭксперт С++
 Аватар для MrGluck
8216 / 5047 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
11.04.2015, 15:25
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <algorithm>
#include <bitset>
#include <iostream>
 
int main()
{
    const size_t bits = 5;
    unsigned long x, max = 0;
    std::cin >> x;
    std::string str = std::bitset<bits>(x).to_string();
    for (size_t i=0; i < bits; i++)
    {
        unsigned long cur = std::bitset<bits>(str).to_ulong();
        std::cout << cur << ": " << str << std::endl;
        if (max < cur)
            max = cur;
        std::rotate(str.begin(), str.begin()+1, str.end());
    }
 
    std::cout << "Max is " << max << " (" << std::bitset<bits>(max) << ")\n";
}
0
 Аватар для Gubila_2000
7 / 3 / 3
Регистрация: 07.11.2014
Сообщений: 218
Записей в блоге: 1
11.04.2015, 15:41  [ТС]
Я просил не писать программу на свой лад, а лишь указать причину зацикливания.
0
2838 / 1647 / 254
Регистрация: 03.12.2007
Сообщений: 4,222
11.04.2015, 17:01
Вижу как минимум выход за границы массивов (индекс "16").
0
 Аватар для Gubila_2000
7 / 3 / 3
Регистрация: 07.11.2014
Сообщений: 218
Записей в блоге: 1
11.04.2015, 18:31  [ТС]
Поставил размер массива 17. Не понимаю почему программа лезет за границы массива, когда при расчетах используется только 16 элементов.

Вот готовая программа, которая прошла все тесты на сайте этой задачи.

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
74
75
76
77
78
79
80
81
82
#include <stdio.h>
#include <math.h>
 
 
int int_pow(int chisl, unsigned short st);
 
int int_pow(int chisl, unsigned short st)
{
    int num=1;
    for (unsigned short i=0; i<st; i++) num*=chisl;
    return(num);
}
 
void main()
{
    unsigned short bin0[17], bin1[17], k, p=0;
    int num, max, n, i;
    
    FILE *f;
 
    f = fopen("INPUT.TXT", "r");
    fscanf(f, "%d", &num);
    fclose(f);
        
    max=num;
    if (num>0){
    for (i=0; i<16; i++)
    {
        bin0[i]=0;
        bin1[i]=0;
    }
    i=16;
 
    while (num!=0)
    {
        k=num%2;
        if (k==0) {bin0[i]=0; bin1[i]=0;}
        else {bin0[i]=1; bin1[i]=1;}
        num/=2;
        i--;
    }
    n=i+1;
 
    while (p!=1)
    {//сдвиг вправо
        k=bin1[16];
        for (i=16; i>=n; i--)
            bin1[i]=bin1[i-1];
        bin1[n]=k;
        
        //перевод в десятичную
        num=0;
        i=0;
        for (k=16; k>=n; k--)
        {
            num+=bin1[k]*int_pow(2,i);
            i++;
        }
    
        if (num > max) max=num;
        
        //сравнение        
        for (i=n; i<=16; i++)
        {
            if (bin0[i]==bin1[i]) {p=1;}
            else {p=0; break;}
        }
    
        
    }
    
    f = fopen("OUTPUT.TXT", "w");
    fprintf(f,"%d",max);
    fclose(f);}
 
    else {
    f = fopen("OUTPUT.TXT", "w");
    fprintf(f,"%d",max);
    fclose(f);}
    
    
}
Добавлено через 3 минуты
Зацикливалось, кстати, из за неправильного сдвига.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
11.04.2015, 18:31
Помогаю со студенческими работами здесь

Проблемы с кодировкой при сравнении строк
Здравствуйте! Мне, нужно сравнить две строки: одну получаю get запросом(на сайте кодировка windows 1251), а вторая указывается...

Ошибка при сравнении введённых данных
Я очень долго пытался решить эту трабл но так и не понял даже ее суть( Суть данного компонента в том что есть 2 массива из которых...

Ошибка при сравнении значений, неправильная сортировка
Есть задание - ввести данные о 10-ти самолетах(работа со структурами). Потом вывести в таблицу все введенные данные, перед этим...

Массивы. Движение при сравнении значений индекса
Задание: Написать программу, которая находит в массиве значения, повторяющиеся два и более раз, и показывает их на экран. Поиском находил...

Перемножение двоичных чисел
Добрый день!:) Возникла проблема при написании калькулятора для двоичных чисел, точнее, проблемы с умножением. Логику сего процесса вроде...


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
Использование 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