Получить все числа в диапазоне от 1 до kkk…kkk (всего n цифр) в системе счисления k

В этой статье я хочу рассмотреть задачу:
Получить все числа в диапазоне от 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#, теперь вы можете использовать для перевода группы чисел в любую систему счисления.

Автор: Евтеев Евгений Александрович
Email: evteev_e2003@mail.ru

Запись опубликована в рубрике C/C++/C#. Добавьте в закладки постоянную ссылку.

Комментарии запрещены.