Partition of Integer into k parts: p(n, k)
#include<stdio.h>
#include<math.h>
int x=1;
void array_print(int p[], int n, int u,int y,int d)
{
int i,s=0,l=u;
int m=d;
int j=1;
if(n<=l)
for(i=0;i<l;i++)
{
s += p[i];
j=j*p[i];
}
if(j>0&&s==y)
{
printf("%d] ",x++);
for (i=0;i<l;i++)
printf("%d ",p[i]);
printf("\n");
}
}
void P(int n,int l)
{
int p[n];
int t=n;
int k = 0;
int g=0;
p[k] = n;
int r;
int f=1,e,x;
while (1)
{
if(k+1<=l)
{
for(e=0;e<l;e++)
x += p[e];
if(x==t)
f++;
}
array_print(p, k+1,l,t,f);
r= 0;
while (k >= 0 && p[k] == 1)
{
r += p[k];
k--;
}
if (k < 0) return;
p[k]--;
r++;
while (r > p[k])
{
p[k+1] = p[k];
r = r- p[k];
k++;
}
p[k+1] = r;
k++;
}
}
int main()
{
int num,l;
printf("\nEnter a number to perform integer partition: ");
scanf("%d", &num);
printf("\nEnter parts of form: \n");
scanf("%d",&l);
P(num,l);
printf("p(%d, %d)=%d", num, l, x-1);
return 0;
}
The above code was made with intention of partition of integer: p(n)
However, Can also print: p(n,k)
But I personally would suggest to use Euler's Identity on Partition of Integer:
p(n,k) = p(n,k-1) + p(n-k, k) where p(n,k=n or k=1)=1
And the same triangle can be completed.
One of the beautiful problems from Number-Theory.