Игра "Быки и коровы"
Разбор и сборка числа
В нашем алгоритме нам потребовалось разобрать число на цифры. Функция int[] Split(int number, int n) из числа number, содержащего n цифр создает массив из n элементов, каждый из которых содержит одну цифру исходного числа.
Давайте рассмотрим более сложную задачу, важную для основ программирования и связанную с представлением чисел в разных системах счисления и перевода числа из одной системы счисления в другую. Пусть нам дано десятичное число, а нам требуется узнать, как оно представлено в системе счисления с основанием p. Число N в системе счисления с основанием p можно представить в виде:
Остаток от деления нацело числа N на основание системы счисления дает последнюю (младшую) цифру числа N, а деление нацело дает число, от которого отрезана последняя цифра.
Пример:
Int N = 1237; Int digit = N % 10; N = N/10; Результат: digit = 7 (последняя цифра числа N) N = 123 (исходное число, от которого отрезана последняя цифра.
Пусть N – десятичное число, p – основание системы счисления, -цифры системы счисления.
Основное соотношение.
Пусть число N записано в системе с основанием p в виде последовательности из k + 1 цифр:
( 5.1) |
Эта запись означает следующее:
Можно вынести p за скобки и представить запись N в виде:
( 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 вначале равно 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.
Домой
- Проанализировать игру "Быки и коровы" в отладочном режиме.
- Добавить проверку корректности ввода. Число, которое вводит пользователь, должно быть в тех же пределах, что и задуманное.
Используя построенный проект перевода чисел, пройти тест 6 курса Информация и данные.