Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Решение задачи Иосифа Флавия через массивы на С# 
V
    Опции темы
gypehot19
Дата 15.10.2016, 13:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Господа программисты, прошу помощи! Необходимо решить задачу Иосифа Флавия через массивы. 
Суть в чем: m воинов, стоящих по кругу, убивают каждого n-го. Требуется определить номер k начальной позиции воина, который останется последним.
Начала делать, но ни в какую не могу реализовать кусок с самим алгоритмом. Воины - массив из булевых переменных с начальным значением true. "Убиваем" каждого третьего (в моем условии), то бишь заменяем на false. Нужно пробегаться по массиву с первого до последнего "еще живого" до тех пор, пока не останется один true, его номер надо вытянуть.
Ничего дельного придумать не могу, помогите, пожалуйста!
Вот что у меня есть:
Код

static void Main(string[] args)
        {
            int m = 10, n = 3;
            Console.WriteLine("{0} воинов стоят по кругу, убивают каждого {1}-го; последним остается воин {2}", m, n, zad_if_mas(n, m));
         }

static int zad_if_mas(int m, int n)
        {
            int k = 0;

            bool[] knights = new bool[m];
            for (int i = 0; i < m; i++)
            {
                knights[i] = true;
            }

            while (m > 1)
            {
               // вот сюда нужно впихать сам алгоритм 
            }

            for (int i = 0; i < m; i++) // поиск номера последнего оставшегося
            {
                if (knights[i] == true)
                {
                    k = i + 1;
                }
            }
            return k;
        }

PM MAIL   Вверх
boevik
Дата 18.10.2016, 16:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1452
Регистрация: 31.5.2004
Где: Израиль

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



Что то в этом роде:
Код

            int currentIndexKnight = -1;
            while (m > 1)
            {
                // вот сюда нужно впихать сам алгоритм 
                int skipped = 0;
                while (skipped < n)
                {
                    currentIndexKnight = currentIndexKnight + 1 < knights.Count() ? currentIndexKnight + 1 : 0;
                    if (knights[currentIndexKnight]) skipped++;
                }
                knights[currentIndexKnight] = false;
                m--;
            }



--------------------
Никогда не говори никогда
PM MAIL WWW   Вверх
gypehot19
Дата 19.10.2016, 16:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



смутно понимаю что в этом куске происходит... но что-то где-то явно сбивается, ибо для входных значений 10 воинов и каждого третьего выдает ответ 2, вместо 4(
PM MAIL   Вверх
boevik
Дата 19.10.2016, 22:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1452
Регистрация: 31.5.2004
Где: Израиль

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



Вот полный код и ответ 4 

Код

        static void Main(string[] args)
        {
            int m = 10, n = 3;
            Console.WriteLine("{0} воинов стоят по кругу, убивают каждого {1}-го; последним остается воин {2}", m, n, zad_if_mas(m, n));
        }
        static int zad_if_mas(int m, int n)
        {
            bool[] knights = initArray(m);
            int currentIndexKnight = -1;
            while (m > 1)
            {
                // вот сюда нужно впихать сам алгоритм 
                int skipped = 0;
                while (skipped < n)
                {
                    currentIndexKnight = currentIndexKnight + 1 < knights.Count() ? currentIndexKnight + 1 : 0;
                    if (knights[currentIndexKnight]) skipped++;
                }
                knights[currentIndexKnight] = false;
                m--;
            }

            int k = 0;
            for (int i = 0; i < knights.Count(); i++) // поиск номера последнего оставшегося
            {
                if (knights[i] == true)
                {
                    k = i + 1;
                }
            }
            return k;
        }

        private static bool[] initArray(int m)
        {
            bool[] knights = new bool[m];
            for (int i = 0; i < m; i++)
            {
                knights[i] = true;
            }
            return knights;
        }



--------------------
Никогда не говори никогда
PM MAIL WWW   Вверх
gypehot19
  Дата 19.10.2016, 23:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



большое сердечное спасибо! теперь выдает все как положено!
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


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

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




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


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

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