В этой статье я хочу рассмотреть задачу:
Получить все числа в диапазоне от 1 до kkk…kkk (всего n цифр) в системе счисления k. K и n вводятся с клавиатуры.
Основное, что должны сделать - это найти общее количество чисел, которые нужно декодировать в систему счисления k и саму декодировку чисел. Количество чисел должно вычисляться по формуле: max = k в степени n – 1, где max - общее количество чисел. Декодировка должна быть универсальна, т.е. переводить десятичное число в любую систему счисления.
Создайте форму как показано на рисунке:
Поле напротив надписи “Введите число” переименуйте в “num_k”, следующее в “num_n”, а объект ListBox в “list_num”. Два раза кликните по кнопке “Получить числа” для создания процедуры вызова события клика по кнопке и скопируйте следующий код:
string num_res = ""; // число в k-й системе счисления int n_k = Convert.ToInt32(num_k.Text); int kolvo = Convert.ToInt32(num_n.Text); int doo = Convert.ToInt32(Math.Pow(Convert.ToDouble(n_k), Convert.ToDouble(kolvo))) - 1; groupBox_num.Text = "Все числа от 1 до " + doo + " в " + n_k + "-й системе счисления"; groupBox_num.Visible = true; list_num.Items.Clear(); for (int i = 1; i < = doo; i++) { int count = 1; if ((n_k == i && n_k != 2 && n_k != 16) || i / n_k < 0 || n_k == 1) { num_res = Convert.ToString(i); } else { int t = 0; int ch = i; num_res = ""; count = 1; for (; ; ) { string ad = ""; int delitel = ch / n_k; double del = ch / n_k; t = ch - delitel * n_k; if (n_k == 16) { int b = ch % n_k; if (b == 10) ad = "A"; else if (b == 11) ad = "B"; else if (b == 12) ad = "C"; else if (b == 13) ad = "D"; else if (b == 14) ad = "E"; else if (b == 15) ad = "F"; else ad = Convert.ToString(t); if( i >= 10 && i < = 15) { num_res += ad; break; } } else ad = Convert.ToString(t); if (del <= 0) { num_res += ad; break; } else num_res += ad; ch = delitel; count++; } } char[] mass = new char[count]; mass = num_res.ToCharArray(); num_res = ""; for (int j = mass.Length - 1; j >= 0; j--) num_res += mass[j]; list_num.Items.Add(Convert.ToString(i) + " = " + num_res); }
Опишем этот код. Сначала вычисляем общее количество чисел, которые нужно декодировать в систему счисления k по формуле, приведенной выше, и приравниваем это значение переменной “doo”. Дальше идет вычисление числа “i” в системе счисления “k”.
Зачем необходимо использовать условие “if ((n_k == i && n_k != 2 && n_k != 16) || n_k == 1)”? Затем, чтобы не вычислять число “i” в системе счисления “k”, которое равно самой системе счисления и если система счисления равна 2 и 16 или не равна 1. Мы просто выводим значение числа “i”, т.е. не нужно переводить число “i” в систему счисления, если “i” – это система счисления.
Если условие не выполняется, то используем универсальный декодировщик для перевода числа “i” в систему счисления “k”. Внутри него встроен декодировщик числа в шестнадцатеричную систему счисления, т.к. в этой системе счисления числа 10, 11, 12, 13, 14, 15 равны “A”, “B”, “C”, “D”, “E”, “F” соответственно.
На заключительном этапе необходимо полученный результат перевода числа расположить в обратном порядке (произвести инверсию), чтобы наше число в системе счисления “k” приняло нужный формат для чтения человеку. Все, выводим результат в нашу форму.
Задача решена и реализована на языке C#, теперь вы можете использовать для перевода группы чисел в любую систему счисления.
Автор: Евтеев Евгений Александрович