Задача
Легендарный учитель математики Юрий Петрович придумал забавную игру с числами. А именно, взяв произвольное целое число, он переводит его в двоичную систему счисления, получая некоторую последовательность из нулей и единиц, начинающуюся с единицы. (Например, десятичное число 1910 = 1*24+0*23+0*22+1*21+1*20 в двоичной системе запишется как 10011.) Затем учитель начинает сдвигать цифры полученного двоичного числа по циклу (так, что последняя цифра становится первой, а все остальные сдвигаются на одну позицию вправо), выписывая образующиеся при этом последовательности из нулей и единиц в столбик — он подметил, что независимо от выбора исходного числа получающиеся последовательности начинают с некоторого момента повторяться. И, наконец, Юрий Петрович отыскивает максимальное из выписанных чисел и переводит его обратно в десятичную систему счисления, считая это число результатом проделанных манипуляций. Так, для числа 19 список последовательностей будет таким:
10011
11001
11100
01110
00111
10011
…
и результатом игры, следовательно, окажется число 1*24+1*23+1*22+0*21+0*20 = 28.
Поскольку придуманная игра с числами все больше занимает воображение учителя, отвлекая тем самым его от работы с ну очень одаренными школьниками, Вас просят написать программу, которая бы помогла Юрию Петровичу получать результат игры без утомительных ручных вычислений.
Входные данные
Входной файл INPUT.TXT содержит одно целое число N (0 ≤ N ≤ 32767).
Выходные данные
Ваша программа должна вывести в выходной файл OUTPUT.TXT одно целое число, равное результату игры.
Примеры
№ INPUT.TXT OUTPUT.TXT
1 19 28
2 1212 1938
Задумка
Узнаём число разрядов числа, записываем их, дублируем их несколько раз. Потом ищем место, где самое большое скопление единиц, переводим в десятичную СС, выводим.
#include <iostream>
#include <string>
#include <cmath>
int main()
{
int number = 0, binarCount = 0;
std::cin >> number;
std::string binarForm;
int q = 0;
while (number > 0)
{
binarForm.push_back(number % 2);
q++;
number /= 2;
binarCount++;
}
for (int i = binarCount - 1; i > -1; i--)
{
binarForm.push_back(binarForm[i]);
q++;
}
for (int i = binarCount - 1; i > -1; i--)
{
binarForm.push_back(binarForm[i]);
q++;
}
for (int i = binarCount - 1; i > -1; i--)
{
binarForm.push_back(binarForm[i]);
q++;
}
int count = 0, number1 = 0, countNumberOne = 0, iteratorNumber = 0;
for (int i = binarCount; i < 3 * binarCount - 1; i++)
{
count++;
if (binarForm[i] == 1)
{
countNumberOne++;
for (int j = i + 1; j < 3 * binarCount; j++)
{
if (binarForm[j] == 1)
{
countNumberOne++;
}
if (binarForm[j] == 0)
{
break;
}
}
if (countNumberOne >= number1)
{
number1 = countNumberOne;
iteratorNumber = count - 1;
}
countNumberOne = 0;
}
}
int result = 0, copyBinarCount = binarCount;
for (int k = copyBinarCount + iteratorNumber; k < 2 * copyBinarCount + iteratorNumber; k++)
{
result += pow(2, binarCount - 1) * binarForm[k];
binarCount--;
}
std::cout << result;
}