Опубликован: 09.12.2017 | Доступ: свободный | Студентов: 737 / 31 | Длительность: 02:06:00
Специальности: Программист
Лекция 7:

Делители числа

< Лекция 1 || Лекция 7: 123
Аннотация: Делители числа На этом уроке рассматриваются разнообразные задачи, связанные с делителями числа. Показано, как построить функцию, определяющую является ли некоторое число d делителем числа N. На этой основе строятся функции, определяющие все пары делителей числа, нахождение всех простых делителей числа. Дается определение простых чисел, совершенных чисел. Обсуждается общий подход поиска некоторого множества элементов с определенными свойствами. Показано, что вначале строится более широкое множество кандидатов, а затем строится фильтр, отбирающий среди кандидатов тех, кто обладает нужными свойствами. По ходу урока дается доказательство некоторых утверждений.

13 классических задач

  1. (**) Перевод числа N из системы с основанием p в систему с основанием q.
  2. (*) Расщепление числа N на цифры.
  3. (*) Является ли число палиндромом?
  4. () Является ли число четным?
  5. () Является ли число d делителем числа N?
  6. (**) Нахождение делителей числа N.
  7. () Является ли число простым?
  8. (**) Нахождение простых чисел.
  9. () Является ли число совершенным?
  10. (*) Нахождение совершенных чисел.
  11. (*) Наибольший общий делитель и наименьшее общее кратное чисел N и M.
  12. (**) Возведение в целую степень.
  13. (*…*) Числа "градины". Проблема "3*N + 1"

Задача 1. Перевод целых чисел из системы счисления с основанием p в систему счисления с основанием q

Эту задачу мы уже рассматривали. Повторение – мать учения.

Для любой позиционной системы счисления справедливо следующее утверждение:

Целое число N в системе счисления с основанием p представимо в виде:

N = M \cdot p + d; ( 7.1)

Здесь d – цифра системы p – младшая цифра записи числа N в системе p,

M – целое число, полученное обрезанием младшей цифры числа N.

Операции % и / позволяют получить d и M.

Выполняя эти операции в цикле, пока число не станет равным нулю, можно перевести число N в систему с основанием p.

Вот соответствующая знакомая нам функция:

        /// <summary>
        /// Перевод целого положительного десятичного числа
        /// в систему с основанием p
        /// </summary>
        /// <param name="N">десятичное число</param>
        /// <param name = "p">основание системы счисления</param>
        /// <returns>число N в системе p, представленное как строка текста</returns>
        public static string From10ToP(int N, int p)
        {
            string res = "";    //результат перевода
            int digit;          //текущая цифра числа в системе p
            while( N != 0)
            {
                digit = N % p;  //получаем последнюю цифру
                N = N / p;      //отрезаем последнюю цифру
                res = digit.ToString() + res; //присоединяем цифру слева к результату

            }
            return res;         //возвращаем результат
        }

Работа у доски

Также просто решается обратная задача – перевод числа из системы p в десятичную систему. Если дано целое число M и к нему нужно присоединить справа следующую цифру d, то можно непосредственно воспользоваться соотношением (7.1), умножая M на p и прибавляя цифру d.

Выполняя эти операции в цикле по числу цифр числа, можно перевести число из системы p в десятичную систему.

Вот знакомая нам функция перевода:

        /// <summary>
        /// перевод целого положительного числа из системы с основанием p 
        /// в десятичное число
        /// </summary>
        /// <param name="N">число N в системе p, представленное как строка текста</param>
        /// <param name="p">основание системы счисления</param>
        /// <returns>десятичное число</returns>
        public static int FromPTo10(string N, int p)
        {
            int res = 0;        //результат перевода
            int digit;          //текущая цифра
            int n = N.Length;   //длина строки - число цифр в записи N
            for (int i = 0; i < n; i++) //цикл по числу цифр, начиная со старшей цифры
            {
                digit = N[i] - '0';     //цифра как разность кода цифры и кода цифры 0
                res = res * p + digit; //присоединяем цифру к результату
            }
            return res;         //возвращаем результат
        }

Работа у доски

Для перевода числа N из системы p в систему q можно вначале перевести N из p в десятичную систему, а затем выполнить перевод из десятичной системы в систему q.

Вот соответствующая функция:

        /// <summary>
        ///  перевод целого положительного числа из системы с основанием p
        ///  в систему с основанием q
        /// </summary>
        /// <param name="N">число N в системе p, представленное как строка текста</param>
        /// <param name="p">основание исходной системы счисления</param>
        /// <param name="q">основание результирующей системы счисления</param>
        /// <returns>число N в системе q, представленное как строка текста</returns>
        public static string FromPToQ(string N, int p, int q)
        {
            int NN = FromPTo10(N, p);
            return From10ToP(NN, q);
            // return From10ToP(FromPTo10(N, p), q); //короткая запись - вызов в вызове

        }

Работа у доски

< Лекция 1 || Лекция 7: 123