Проблема с оптимизацией цикла

279
29 апреля 2022, 15:30

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

#include <windows.h>
#include <string>
#include <iostream>
#include <climits>
using namespace std;
string to_binary_string(unsigned int n)
{
   string result;
   string ost;
   do
   {
       ost = '0' + (n % 2);
       result = ost + result;
       n = n / 2;
   } while (n > 0);
   return result;
}
string reverse_string(string n)
{
   string n1;
   for (int i = n.size() - 1; i >= 0; i--)
       n1 += n[i];
   return n1;
}
int from_bin_to_int(string n)
{
   int result = 0;
   int raz = 1;
   for (int i = n.size()-1; i >=0 ; i--)
   {
       if (n[i] == '1')
           result += raz;
       raz *= 2;
   }

   return result;
}

int main()
{
   SetConsoleCP(1251);
   SetConsoleOutputCP(1251);
   unsigned int int_bin, min= INT_MAX, max= 0;
   string result, binary, reverse_binary;
   int a,b;
     cout << "enter segment[a:b]\n";
     cin >> a;
     cin >> b;
     if ((a > max && b <= min) && ((unsigned int(a) == a && unsigned int(b)== b))&&(a<=b))
     {
         for (  a ; a <= b; a++)
         {
             binary = to_binary_string(a);
             reverse_binary = reverse_string(binary);
             int_bin = from_bin_to_int(reverse_binary);
             if (int_bin > max)
                 max = int_bin;
             if (int_bin < min&&min!=1)
                 min = int_bin;
         }
         cout << min << endl;
         cout << max << endl;
     }
     else
         cout << "Wrong input";
   return 0;
} 
Answer 1

Оптимизировал)

unsigned int reverse(unsigned int n) {
    auto n1 = n;
    auto num_width = 0;
    while (n1) {
        num_width++;
        n1 >>= 1;
    }
    unsigned res = 0;
    unsigned current_pow = 1 << (num_width-1);
    do {
        if (n & 1) {
            res += current_pow;
        }
        current_pow >>= 1;
        n >>= 1;
    } while (n > 0);
    return res;
}
// int_bin = reverse(a);

Или проще:

unsigned reverse(unsigned n) {
    unsigned r = 0;
    for (r=n&1; n>>=1; r+=r+(n&1));
    return r;
}

На корректное решение задачи поиска min/max(без брутфорса) сейчас нет времени :(

В ответ @Harry:

unsigned rev(unsigned x)
{
    unsigned s=8*sizeof(x)-ceil(log2(x+(x&(x-1)==0)));
    x = (x & 0x55555555) << 1 | (x >> 1) & 0x55555555;
    x = (x & 0x33333333) << 2 | (x >> 2) & 0x33333333;
    x = (x & 0x0f0f0f0f) << 4 | (x >> 4) & 0x0f0f0f0f;
    x = (x << 24) | ((x & 0xFF00) << 8) | (( x >> 8) & 0xFF00) | (x >> 24);
    return s ? x >> s : x;
}
READ ALSO
Ошибка при компиляции проекта с boost?

Ошибка при компиляции проекта с boost?

Не собирается программа код ниже:

295
SFML: улавливание кириллицы в TextEntered

SFML: улавливание кириллицы в TextEntered

Если использовать код из официальной документации SFML

213
Парсер файлов настроек

Парсер файлов настроек

Есть одна проблемка, я попытался написать свой парсер для чтения таких файлов:

256