10 / 10 / 1
Регистрация: 27.06.2013
Сообщений: 151

"Забавная игра"

12.03.2014, 20:52. Показов 16153. Ответов 13
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Есть задача:

Забавная игра
(Время: 1 сек. Память: 16 Мб Сложность: 30%)
Легендарный учитель математики Юрий Петрович придумал забавную игру с числами. А именно, взяв произвольное целое число, он переводит его в двоичную систему счисления, получая некоторую последовательность из нулей и единиц, начинающуюся с единицы. (Например, десятичное число 1910 = 1*24+0*23+0*22+1*21+1*20 в двоичной системе запишется как 100112.) Затем учитель начинает сдвигать цифры полученного двоичного числа по циклу (так, что последняя цифра становится первой, а все остальные сдвигаются на одну позицию вправо), выписывая образующиеся при этом последовательности из нулей и единиц в столбик — он подметил, что независимо от выбора исходного числа получающиеся последовательности начинают с некоторого момента повторяться. И, наконец, Юрий Петрович отыскивает максимальное из выписанных чисел и переводит его обратно в десятичную систему счисления, считая это число результатом проделанных манипуляций. Так, для числа 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 одно целое число, равное результату игры.

intput 19
output 28

intput 1212
output 1938

мое решение (не проходит тест 8):
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
#include <iostream>
 
using namespace std;
 
int main ()
{
    freopen("input.txt","r",stdin);
    freopen("output.txt","w",stdout);
    int n, m=0, i, z, l, p, m1, rez;
    cin >> n;
    bool a[32]={0}, b[16]={0};
    m1=n;
    while(n){
        m++;
        n/=2;
    }
 
    n=m1;
    m1=m-1;
    while(n){
        a[m1--]=n%2;
        n/=2;
    }
 
    if(m==0) cout << 0;
    else{
        for(i=0; i<m; i++) a[i+m]=a[i];
 
        l=0; z=0; p=0;
        
        for(i=0; i<m*2; i++) 
            if(a[i]) l++;
            else {
                if(l>z) { z=l; p=i-l; }
                l=0;
            }
            if(l>z) { z=l; p=i-l; }
            
            m1=m-1;
            for(i=0; i<m; i++) b[m1--]=a[p++];
        
        n=1;
        rez=0;
        for(i=0; i<m; i++, n*=2) { 
            rez+=b[i]*n;
        }
        cout << rez;
    }
}
Если кто имеет идеи по решению и\или решение прошу предоставить.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
12.03.2014, 20:52
Ответы с готовыми решениями:

Забавная игра
Забавная игра Вы с друзьями играете в следующую игру. Друзья пишут на доске подряд N натуральных чисел. Ваша задача — найти как можно...

Забавная игра
Забавная игра Вы с друзьями играете в следующую игру. Друзья пишут на доске подряд N натуральных чисел. Ваша задача — найти как можно...

Игра Кости, игра с компьютером
Всем привет! Делаю консольную игру Кости. Условия такие: 1) Перед игрой все игроки бросают кость, первым начинает тот, у кого выпало...

13
102 / 102 / 40
Регистрация: 24.01.2014
Сообщений: 1,242
12.03.2014, 20:52
ALEXKIRNAS, алгоритм - введенное число перевести в 2-ую систему -> записать в массив -> сдвинуть числа -> записать в массив -> проверить повторилось число или нет -> если нет, повторять 2 последних дейсвтия, покуда не повторится -> из элементов массива найти максимальное -> вывести в файл
0
10 / 10 / 1
Регистрация: 27.06.2013
Сообщений: 151
12.03.2014, 20:58  [ТС]
задача взята с асмп.ру

Добавлено через 5 минут
У меня реализирован другой алгоритм:
Берем число (например 29), переводим в двоичну систему (11101), далее записую в массив и дублирую.
Получаю такой массив (1110111101). Далее ищу найбольшое скопление единиц и откуда беру число длиной ровной длине числа в двоичной системе (тут 5) (1110111101). Переводю в нормальный вид.
0
102 / 102 / 40
Регистрация: 24.01.2014
Сообщений: 1,242
12.03.2014, 21:06
ALEXKIRNAS, интересное решение, но разве условием не является именно сдвигать числа ?
0
10 / 10 / 1
Регистрация: 27.06.2013
Сообщений: 151
12.03.2014, 21:16  [ТС]
да в условии так, но от нас требуется только ответ. Я уже несколько часов придумаю тесты, но моя программа ни один не завалила, а на асмп.ру она не проходит 8 тест. :-(
0
102 / 102 / 40
Регистрация: 24.01.2014
Сообщений: 1,242
12.03.2014, 22:26
ALEXKIRNAS, a 4to za 8 test ?
0
10 / 10 / 1
Регистрация: 27.06.2013
Сообщений: 151
13.03.2014, 15:49  [ТС]
Если б знал, то не писал бы в форуме.
0
Модератор
Эксперт по электронике
8981 / 6748 / 921
Регистрация: 14.02.2011
Сообщений: 23,871
13.03.2014, 16:03
Цитата Сообщение от ALEXKIRNAS Посмотреть сообщение
Например, десятичное число 1910 = 1*24+0*23+0*22+1*21+1*20 в двоичной системе запишется как 100112.)
я один ничего не понял
1910 в двоичной будет 11101110110
100112. откуда в двоичной системе двойка?

Добавлено через 1 минуту
Цитата Сообщение от ALEXKIRNAS Посмотреть сообщение
он подметил, что независимо от выбора исходного числа получающиеся последовательности начинают с некоторого момента повторяться.
циклический сдвиг, однако
0
10 / 10 / 1
Регистрация: 27.06.2013
Сообщений: 151
13.03.2014, 17:38  [ТС]
Здесь условие немного подпорчено. Насамом деле так:
1910 = 1*24+0*23+0*22+1*21+1*20
0
Модератор
Эксперт по электронике
8981 / 6748 / 921
Регистрация: 14.02.2011
Сообщений: 23,871
13.03.2014, 19:28
Цитата Сообщение от ALEXKIRNAS Посмотреть сообщение
1910

универсальная функция циклического массива сдвига переменной любой(в пределах разумного) разрядности
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
unsigned int rcl( unsigned int n // число которое нужно сдвигать
                      int r,  // разрядность числа
                      int d  // на сколько сдвинуть 
 ) 
{
int k=sizeof(int)*8; // размер int в битах
unsigned int m=(unsigned int) -1; // 0xFFFFFFFF
m>>=r-k;// создаем маску
 
n=((n>>d)||(n<<r-d))&m; // сам циклический сдвиг
return n;
 
}

т.е нужно
1 высчитать разрядность числа циклом while
2 в цикле for пройти все сдвиги с запоминанием максимального
3 вывести максимальное
и все никаких массивов
0
 Аватар для Dmitry Vin
3 / 3 / 0
Регистрация: 20.11.2019
Сообщений: 18
25.01.2020, 21:29
Вот решение задачи. Код прошел проверку на acmp . ru и принял решение как правильное.
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
#include <iostream>
#include <string>
#include <cmath>
using namespace std;
long long intenth(string a){
    long long res=0, st = 1;
    for(int i=0; i<a.length(); i++){
        res+=(a[a.length()-i-1]-48)*st;
        st*=2;
    }
    return res;
}
string indouble(int n){
    string str = "";
    int w=1;
    while(w<=n)w*=2;
    while(n!=0){
        w/=2;
        if(n-w>=0){
            n-=w;
            str+='1';
        }else str+='0';
 
    }
    if(w!=1){
        while(w!=1){
            str+='0';
            w/=2;
        }
    }
    return str;
}
int main(){
    string t;
    int n, m = -1;
    cin>>n;
    m = max(m, n);
    int bench = n;
    t = indouble(n);
    char st = t[t.length()-1];
    for(int i=t.length()-1; i>0; i--){
        t[i] = t[i-1];
    }
    t[0] = st;
    n=intenth(t);
    m = max(m, n);
    while(n!=bench){
        st = t[t.length()-1];
        for(int i=t.length()-1; i>0; i--){
            t[i] = t[i-1];
        }
        t[0] = st;
        n=intenth(t);
        m = max(m, n);
    }
    cout<<m;
}
1
863 / 513 / 215
Регистрация: 19.01.2019
Сообщений: 1,216
26.01.2020, 00:22
Dmitry Vin, чего-то перемудрили.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <iostream>
#include <algorithm>
 
int main()
{
    uint16_t n, m(0);
    std::cin >> n;
    if (n) {
        uint8_t off(15);
        for (uint16_t i(n); !(i & (1 << 15)); --off, i <<= 1);
        for (uint16_t i(0); i < off + 1; ++i, n = ((n & ~(1ul << off)) << 1) | (n >> off)) m = std::max(m, n);
    }
    std::cout << m;
    return 0;
}
1
26.01.2020, 00:30

Не по теме:

"забавно", что спустя почти 6 лет подняли тему)

0
 Аватар для Dmitry Vin
3 / 3 / 0
Регистрация: 20.11.2019
Сообщений: 18
26.01.2020, 11:56
nalbe666, спасибо за интересный код. Если честно, большинство операторов в нем я не понял, но очень хотелось бы писать такие эффективные и короткие решения, как у Вас. Буду изучать Ваш код и учиться новому.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
26.01.2020, 11:56
Помогаю со студенческими работами здесь

Игра слов, игра Scrabble
Задание: Создать программу для решения задачи построения слова из некоторого множества букв (игра Scrabble) используя алгоритмы поиска в...

Забавная фича C++ Builder 6
Может, я не первый, кто это открыл, но сегодня я кое-что выяснил. Рассмотрим код #include &lt;iostream.h&gt; #include...

Как сделать так, чтобы при нажатии на кнопку "Новая игра" игра начиналась заново?
Как сделать так, чтобы при нажатии на кнопку &quot;Новая игра&quot; игра начиналась заново? unit1.cpp void __fastcall TForm1::N1Click(TObject...

Забавная игра
Вы с друзьями играете в следующую игру. Друзья пишут на доске подряд N натуральных чисел. Ваша задача — найти как можно больше подряд...

Забавная игра
Забавная игра Вы с друзьями играете в следующую игру. Друзья пишут на доске подряд N натуральных чисел. Ваша задача — найти как можно...


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

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Опции темы

Новые блоги и статьи
Модель заражения группы наркоманов
alhaos 17.04.2026
Условия задачи сформулированы тут Суть: - Группа наркоманов из 10 человек. - Только один инфицирован ВИЧ. - Колются одной иглой. - Колются раз в день. - Колются последовательно через. . .
Мысли в слух. Про "навсегда".
kumehtar 16.04.2026
Подумалось тут, что наверное очень глупо использовать во всяких своих установках понятие "навсегда". Это очень сильное понятие, и я только начинаю понимать край его смысла, не смотря на то что давно. . .
My Business CRM
MaGz GoLd 16.04.2026
Всем привет, недавно возникла потребность создать CRM, для личных нужд. Собственно программа предоставляет из себя базу данных клиентов, в которой можно фиксировать звонки, стадии сделки, а также. . .
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . . а удачный момент так и не приходит.
Фиксация колонок в отчете СКД
Maks 14.04.2026
Фиксация колонок в СКД отчета типа Таблица. Задача: зафиксировать три левых колонки в отчете. Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка) / / . . .
Настройки VS Code
Loafer 13.04.2026
{ "cmake. configureOnOpen": false, "diffEditor. ignoreTrimWhitespace": true, "editor. guides. bracketPairs": "active", "extensions. ignoreRecommendations": true, . . .
Оптимизация кода на разграничение прав доступа к элементам формы
Maks 13.04.2026
Алгоритм из решения ниже реализован на нетиповом документе, разработанного в конфигурации КА2. Задачи, как таковой, поставлено не было, проделанное ниже исключительно моя инициатива. Было так:. . .
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru