/// <summary> /// Рекурсивный метод записи данных в файл /// </summary> /// <param name="num_group">one group at the moment</param> /// <param name="groups">total groups</param> /// <param name="number">user value</param> public static void Recursion(int num_group, int groups, int number) { List <int> myList = Perebor(num_group, number); FileProcess.Write(myList, num_group); if (num_group + 1 < groups) { Recursion(num_group + 1, groups, number); } else { return; } }
static void Main(string[] args) { #region Homework /// Домашнее задание /// /// Группа начинающих программистов решила поучаствовать в хакатоне с целью демонстрации /// своих навыков. /// /// Немного подумав они вспомнили, что не так давно на занятиях по математике /// они проходили тему "свойства делимости целых чисел". На этом занятии преподаватель показывал /// пример с использованием фактов делимости. /// Пример заключался в следующем: /// Написав на доске все числа от 1 до N, N = 50, преподаватель разделил числа на несколько групп /// так, что если одно число делится на другое, то эти числа попадают в разные руппы. /// В результате этого разбиения получилось M групп, для N = 50, M = 6 /// /// N = 50 /// Группы получились такими: /// /// Группа 1: 1 /// Группа 2: 2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 /// Группа 3: 4 6 9 10 14 15 21 22 25 26 33 34 35 38 39 46 49 /// Группа 4: 8 12 18 20 27 28 30 42 44 45 50 /// Группа 5: 16 24 36 40 /// Группа 6: 32 48 /// /// M = 6 /// /// =========== /// /// N = 10 /// Группы получились такими: /// /// Группа 1: 1 /// Группа 2: 2 7 9 /// Группа 3: 3 4 10 /// Группа 4: 5 6 8 /// /// M = 4 /// /// Участники хакатона решили эту задачу, добавив в неё следующие возможности: /// 1. Программа считыват из файла (путь к которому можно указать) некоторое N, /// для которого нужно подсчитать количество групп /// Программа работает с числами N не превосходящими 1 000 000 000 /// /// 2. В ней есть два режима работы: /// 2.1. Первый - в консоли показывается только количество групп, т е значение M /// 2.2. Второй - программа получает заполненные группы и записывает их в файл используя один из /// вариантов работы с файлами /// /// 3. После выполения пунктов 2.1 или 2.2 в консоли отображается время, за которое был выдан результат /// в секундах и миллисекундах /// /// 4. После выполнения пунта 2.2 программа предлагает заархивировать данные и если пользователь соглашается - /// делает это. /// /// Попробуйте составить конкуренцию начинающим программистам и решить предложенную задачу /// (добавление новых возможностей не возбраняется) /// /// * При выполнении текущего задания, необходимо документировать код /// Как пометками, так и xml документацией /// В обязательном порядке создать несколько собственных методов #endregion int number = WorkProcess.Number(); if (number == 0) { Console.WriteLine("Число должно быть больше нуля"); Console.ReadKey(); return; } int select = WorkProcess.SelectWork("work mode"); int groups = Convert.ToInt32(Math.Floor(Math.Log(number, 2) + 1)); //расчёт количества M групп Stopwatch stopWatch = new Stopwatch(); stopWatch.Start(); if (select == 1) { OutPut.OutputConsole(groups); } else { WorkProcess.Recursion(0, groups, number); } stopWatch.Stop(); TimeSpan ts = stopWatch.Elapsed; //подсчёт времени работы операций OutPut.OutTimespan(ts); int archiveselect; if (select == 2) { archiveselect = WorkProcess.SelectWork("archive"); if (archiveselect == 1) { FileProcess.Archive(); } } Console.WriteLine("Завершено!"); Console.ReadKey(); }