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

Игра "Быки и коровы"

< Лекция 1 || Лекция 5: 123456
Разбор и сборка числа

В нашем алгоритме нам потребовалось разобрать число на цифры. Функция int[] Split(int number, int n) из числа number, содержащего n цифр создает массив из n элементов, каждый из которых содержит одну цифру исходного числа.

Давайте рассмотрим более сложную задачу, важную для основ программирования и связанную с представлением чисел в разных системах счисления и перевода числа из одной системы счисления в другую. Пусть нам дано десятичное число, а нам требуется узнать, как оно представлено в системе счисления с основанием p. Число N в системе счисления с основанием p можно представить в виде: $N=M \cdot p + c_{0}$

Остаток от деления нацело числа N на основание системы счисления дает последнюю (младшую) цифру числа N, а деление нацело дает число, от которого отрезана последняя цифра.

Пример:

Int N = 1237;
Int digit = N % 10;
N = N/10;
Результат: digit = 7 (последняя цифра числа N) 
N = 123 (исходное число, от которого отрезана последняя цифра.

Пусть N – десятичное число, p – основание системы счисления, ${d_{0}, d_{1}, d_{2},\hdots d_{p-1},}$ -цифры системы счисления.

Основное соотношение.

c_{k}c_{k-1}c_{k-2}\hdots c_{1}c_{0}.

Пусть число N записано в системе с основанием p в виде последовательности из k + 1 цифр:

N = c_{k} \cdot p^{k} + c_{k-1} \cdot p^{k-1} + c_{k-2} \cdot p^{k-2} + \hdots + c_{1} \cdot p + c_{0}. ( 5.1)

Эта запись означает следующее:

N = (c_{k} \cdot p^{k-1} + c_{k-1} \cdot p^{k-2} + c_{k-2} p^{k-3} + \hdots + c_{1}) \cdot p + c_{0}.

Можно вынести p за скобки и представить запись N в виде:

N = M \cdot p + c_{0} ( 5.2)

Число в скобках – это целое число. Обозначим его через M. Тогда

Теперь нетрудно с помощью наших замечательных операций повторить процесс и получить младшую цифру в записи десятичного числа M в системе с основанием p, а также получить число, в котором эта цифра отрезана.

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

string From10ToP(int N, int p)
        {
            int digit;
            string res = "";
            while (N != 0)
            {
                digit = N % p;  //младшая цифра
                N = N / p;      //отрезаем младшую цифру
                res = digit + res;  //присоединяем цифру слева к строке результата
            }
            return res;
        }
Сборка числа

Если известна запись числа N в системе с основанием p, то используя соотношение (5.1) можно получить десятичное значение N. Кажется, что для этого нужно возводить в степень основание системы p. Однако существует красивый алгоритм, называемый схемой Горнера, позволяющий обходиться только операциями умножения и сложения.

$$M = M \cdot p + c_{k-1}$$

Пусть M вначале равно ck – старшей цифре. Вычислим теперь новое значение M

Продолжим этот процесс, каждый раз умножая M на основание системы счисления и прибавляя следующую цифру. Последний шаг будет соответствовать соотношению (5.2) и даст десятичное значение N.

Вот как может выглядеть соответствующая функция перевода числа из системы P в десятичную систему:

int FromPTo10(string Np, int p)
        {
            int res = 0; 
            int n = Np.Length;
            int digit; 
            for(int i = 0; i < n; i++)
            {
                digit = Np[i] - '0'; //из строки выделяем очередную цифру
                res = res * p + digit; 
            }
            return res;
        }

Работа в классе

Построить Windows проект перевода чисел из 10-ичной системы в систему с основанием P (P 10) и обратного перевода из P в 10.

Домой

  1. Проанализировать игру "Быки и коровы" в отладочном режиме.
  2. Добавить проверку корректности ввода. Число, которое вводит пользователь, должно быть в тех же пределах, что и задуманное.

Используя построенный проект перевода чисел, пройти тест 6 курса Информация и данные.

< Лекция 1 || Лекция 5: 123456