Программа работает верно для небольших отрезков, но когда задается отрезок к примеру от 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;
}
Оптимизировал)
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;
}
Если использовать код из официальной документации SFML
Есть одна проблемка, я попытался написать свой парсер для чтения таких файлов: