С Новым годом! Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.76/79: Рейтинг темы: голосов - 79, средняя оценка - 4.76
10 / 10 / 1
Регистрация: 27.06.2013
Сообщений: 151

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

12.03.2014, 20:52. Показов 15926. Ответов 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
Модератор
Эксперт по электронике
8978 / 6744 / 921
Регистрация: 14.02.2011
Сообщений: 23,857
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
Модератор
Эксперт по электронике
8978 / 6744 / 921
Регистрация: 14.02.2011
Сообщений: 23,857
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
Ответ Создать тему
Новые блоги и статьи
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru