#include #include #include //--------------------------------------------------------------------------- // В этом массиве будет формироваться разложение // Должен быть достаточного размера, чтобы хранить самое длинное разложение // Упрощенно - не менее 2*VALUE+1 символов char buffer[2048]; //--------------------------------------------------------------------------- // Выводит в stdout разложение на слагаемые заданного числа // Вх.параметры: // value - раскладываемое значение // up_limit - значение на 1 меньше, чем value // buff - буфер, используемый для хранения текст.представления // offset - 0 void Spread(unsigned value, unsigned up_limit, char * buff, unsigned offset) { if( value == 0 ) { // формирование строки закончено buff[offset-1] = '\n'; buff[offset] = 0; printf(buff); } else { unsigned i,len; i = min(up_limit,value); do { // записываем очередное слагаемое itoa(i,buff+offset,10); // вычисляем смещение для следующего слагаемого len = strlen(buff+offset)+offset; // дописываем + buff[len++] = '+'; // вычисляем следующее слагаемое Spread(value-i,i,buff,len); } while( --i > 0 ); } } //--------------------------------------------------------------------------- // Раскладываемое число. Должно быть больше 1 #define VALUE 10 // !! Общий размер результата растет в квадратичной зависимости от VALUE // !! для 30 длина будет 110 кБ #pragma argsused int main(int argc, char* argv[]) { Spread(VALUE,VALUE-1,buffer,0); return 0; } //---------------------------------------------------------------------------