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

6 апреля 2009

В этой статье я хочу рассмотреть задачу:
Получить все числа в диапазоне от 1 до kkk…kkk (всего n цифр) в системе счисления k. K и n вводятся с клавиатуры.

Основное, что должны сделать - это найти общее количество чисел, которые нужно декодировать в систему счисления k и саму декодировку чисел. Количество чисел должно вычисляться по формуле: max = k в степени n – 1, где max - общее количество чисел. Декодировка должна быть универсальна, т.е. переводить десятичное число в любую систему счисления.

Создайте форму как показано на рисунке:

Получить все числа в диапазоне от 1 до kkk…kkk

Получить все числа в диапазоне от 1 до kkk…kkk

Поле напротив надписи “Введите число” переименуйте в “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” приняло нужный формат для чтения человеку. Все, выводим результат в нашу форму.

Результат выполнения программы Получить все числа в диапазоне от 1 до kkk…kkk

Результат выполнения программы Получить все числа в диапазоне от 1 до kkk…kkk

Задача решена и реализована на языке C#, теперь вы можете использовать для перевода группы чисел в любую систему счисления.

Автор: Евтеев Евгений Александрович