Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Нумерация клеток заданной полоски после сгибания 
V
    Опции темы
al8sell
Дата 2.6.2016, 19:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 2.6.2016

Репутация: нет
Всего: нет



Доброго времени суток! 
Есть такое задание:
Дана полоска длиной 2^k клеток и шириной в одну клетку. Полоску несколько раз сгибают пополам так, чтобы ее правая половина оказывалась под левой. Сгибают до тех пор, пока сверху остается больше одной клетки. Написать программу, которая пронумерует клетки так, что после завершения сгибания полоски номера клеток в полученной колонке будут упорядочены: 1, 2, 3 , 4 , ..., 2^k.
Помогите пожалуйста! 

Это сообщение отредактировал(а) al8sell - 4.6.2016, 09:15
PM MAIL   Вверх
feodorv
Дата 3.6.2016, 20:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 12
Всего: 45



2*k или всё-таки 2^k (два в степени k)?


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
al8sell
Дата 3.6.2016, 21:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 2.6.2016

Репутация: нет
Всего: нет



feodorv,  2^k (наверное, в условии опечатка).
PM MAIL   Вверх
feodorv
Дата 4.6.2016, 18:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 12
Всего: 45



Получилось так:
Код
#include <stdio.h>

int getnum( int k, int n)
{
  if( k == 1 ) return n & 1;
  if( n & 1 )
    return (1 << k) - 1 - getnum( k-1, ((1 << k) - 1 - n) >> 1);
  else
    return getnum( k-1, n >> 1);
}

int solution( int k, int index)
{
  if( k == 0 ) return 0;
  if( k == 1 ) return index & 1;
  if( index & 1 )
    return (getnum( k-1, ((1 << k) - 1 - index) >> 1) << 1) + 1;
  else
    return getnum( k-1, index >> 1) << 1;
}

int main( void )
{
  int i, k = 4;

  for( i = 0; i < (1 << k); ++i)
    printf( " %d", solution( k, i)+1);
  printf( "\n" );
}
И как оно так получилось, лучше не спрашивайте)))


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
al8sell
Дата 4.6.2016, 18:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 2.6.2016

Репутация: нет
Всего: нет



feodorv, спасибо) попробую разобраться)
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0417 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.