[an error occurred while processing this directive]
|
Пусть исходное число хранится в переменной R0.
Делаем следующее:
Делаем двумерный массив из 40 элементов (заметим, что он уже не упорядоченный, т.к. добавил нули):
int M [4][10] = {9000, 8000, 7000, ..., 1000, 0, 900, 800, ..., 100, 0, 90, 80, ..., 10, 0, 9, 8, ..., 1, 0}
int *M_ptr = M; //адрес первого элемента массива M
int *M_Digits_ptr_basic = &M[4][0]; //адрес ряда, где находятся цифры
int *M_Digits_ptr; //вспомогательный указатель на ряд цифр.
//При помощи него будем бежать по ряду
A=R0;
dec_digit_index = 0;
do {
//восстанавливаем указатель на ряд цифр
M_Digits_ptr = M_Digits_ptr_basic;
//ищем наибольшее число в массиве, которое не превосходит А
while (A>*M_ptr)
{
M_Digits_ptr++;
M_ptr++;
}
//вычитаем найденное наибольшее число (оно может быть и нулем)
A -= *M_ptr++;
//записываем значение цифры. Все цифры находятся в 4-м ряду матрицы
DecDigit[dec_digit_index++] = *M_Digits_ptr++;
} while (A>0);
В данном алгоритме будут присутствовать начальные незначащие нули, если число меньше 1000. Избавиться от этого несложно путем добавления флага "быть_первой_найденной_ненулевой_цифрой". Либо можно в конце найти индекс первой ненулевой цифры и запомнить его, а при выводе числа на экран начинать вывод с этого индекса.
Количество операций будет пропорционально 40*3+4*4+2
E-mail: info@telesys.ru