Разложение числа на слагаемые - C (СИ) (77359)
Формулировка задачи:
Не могу найти найти не рекурсивный алгоритм разложения числа на заданное кол-во слагаемых. Может у кого есть реализованный?
алгоритм есть, но вот с паскалем трудности возникают((
procedure Next;
begin
{найти i: (i<L) and ( (X[i-1]>X[i]) or (i=1) )}
X[i]:=X[i]+1;
{ L:= i + X[i+1]+...+X[L] - 1 }
X[i+1]:=...:=X[L]:=1
end;
Через L мы обозначили количество слагаемых в текущем разбиении (понятно, что 1<=L<=N). Программа будет выглядеть так:
program Razbieniya;
type Razb=array [byte] of byte;
var N,i,L:byte;
X:Razb;
procedure Next(var X:Razb;var L:byte);
var i,j:byte;
s:word;
begin
i:=L-1;s:=X[L];
{поиск i}
while (i>1)and(X[i-1]<=X[i]) do begin s:=s+X[i];dec(i) end;
inc(X[i]);
L:=i+s-1;
for j:=i+1 to L do X[j]:=1
end;
begin
write('N=');readln(N);
L:=N; for i:=1 to L do X[i]:=1;
for i:=1 to L do write(X[i]);writeln;
repeat
Next(X,L);
for i:=1 to L do write(X[i]);writeln
until L=1
end.Решение задачи: «Разложение числа на слагаемые»
textual
Листинг программы
static const int CacheN = 400;
static const int CacheK = 50;
static unsigned __int64 pCache[CacheN][CacheK];
unsigned __int64 PStep(int n, int k) {
unsigned __int64 s;
if (n<CacheN && k<CacheK) {
s = pCache[n][k];
if (s) return s;
}
int r = n - k;
if ( k<r ) {
s = 0;
for (int m=1; m<=k; m++) s += PStep(r, m);
} else {
s = 1;
for (int m=1; m<r; m++) s += PStep(r, m);
}
if (n<CacheN && k<CacheK) pCache[n][k] = s;
return s;
}
unsigned __int64 P(int n, int k) {
if ( n<0 || k<0 || n<k ) return 0;
if ( n==k ) return 1;
if ( k==0 ) return 0;
unsigned __int64 res = PStep(n, k);
return res;
}
int main() {
unsigned __int64 s;
int n, k;
do {
std::cin >> n >> k;
s = P(n, k);
std::cout << s << std::endl;
} while (s);
return 0;
}
Объяснение кода листинга программы
- В этом коде реализуется функция
PStep, которая вычисляет некоторые значения, используя итеративный подход. Эта функция использует массивpCache, чтобы сохранить уже вычисленные значения. Если значение уже есть в массиве, оно возвращается, в противном случае оно вычисляется. - Функция
Pиспользует функциюPStepдля вычисления значений и возвращает результат. - В функции
mainсоздается цикл, который считывает числаnиkс консоли и вызывает функциюP, чтобы вычислить значениеs. Затем значениеsвыводится на консоль. Цикл продолжается до тех пор, покаsне станет равным нулю. - В этом коде используется тип данных
unsigned __int64, который представляет собой 64-битное беззнаковое целое число. - Константы
CacheNиCacheKопределяют размер массиваpCache. - Массив
pCacheобъявлен как статический член класса, поэтому его размер не может быть изменен во время выполнения программы. - Код не содержит обработки ошибок или проверки на входные данные, которые могут привести к переполнению или другим проблемам.
- В этом коде не используются библиотеки или сторонние функции, все вычисления выполняются внутри функции
main. - Код не компилируется без предоставления определения функции
PStep, которое должно быть добавлено в файл заголовочного кода. - В этом коде не используются переменные, которые могут быть объявлены в других блоках кода, что означает, что любые переменные, объявленные внутри функций, будут уничтожены, когда они выйдут из области видимости.
- Функция
mainвозвращает значение0, чтобы указать, что программа успешно завершилась. - Этот код не использует многопоточность или асинхронное программирование.
- В этом коде не используются константы или макросы, которые могут быть определены в других файлах или заголовочных файлах.
- В этом коде не используются функции ввода-вывода, такие как
cinиcout, которые могут быть определены в других файлах или заголовочных файлах. - В этом коде не используются функции, которые могут быть определены в других файлах или заголовочных файлах.
- В этом коде не используются структуры данных или классы, которые могут быть определены в других файлах или заголовочных файлах.
- В этом коде не используются указатели или ссылки, которые могут быть определены в других файлах или заголовочных файлах.
- В этом коде не используются переменные, которые могут быть определены в других файлах или заголовочных файлах.
- В этом коде не используются функции, которые могут быть определены в других файлах или заголовочных файлах.
- В этом коде не используются функции, которые могут быть определены в других файлах или заголовочных файлах.