Запишем целое десятичное число N в двоичной системе счисления и образуем все левые циклические сдвиги числа N, у которых первая цифра числа переносится в конец.
Например, если N = 11, то в двоичной системе это 10112, его циклические сдвиги: 01112, 11102, 11012, 10112. Максимальное значение M у всех полученных таким образом чисел будет иметь число 11102 = 1410.
Для заданного числа N определить максимальное значение M.
Единственное число N. 1 ≤ N ≤ 2·109.
Искомое число M.
#include "iostream"
using namespace std;
int main()
{
int k,n=0,i,j,max=0,a[31][31],fl;
cin >> k;
while(k > 0)
{
a[0][n++]=k%2;
k/=2;
}
for(i=1; i < n; i++)
{
for(j=0; j < n; j++)
a[i][j]=a[0][(j+i)%n];
fl=0;
for(j=n-1; j >= 0 && fl==0; j--)
{
if(a[max][j] > a[i][j])
fl=1;
if(a[max][j] < a[i][j])
fl=2;
}
if(fl==2) max=i;
}
j=1;
for(i=0; i < n; i++)
{
k+=a[max][i]*j;
j*=2;
}
cout << k << endl;
}
Назад
Есть решение которого нет на сайте? Пиши admin@devexe.top