113 lines
1.8 KiB
C++
113 lines
1.8 KiB
C++
/*
|
|
* C++ Program to Generate All Unique Partitions of an Integer
|
|
*/
|
|
#include<iostream>
|
|
using namespace std;
|
|
/*
|
|
* print an array p[] of size 'n'
|
|
*/
|
|
void printArray(int p[], int n)
|
|
{
|
|
for (int i = 0; i < n; i++)
|
|
cout << p[i] << " ";
|
|
cout << endl;
|
|
}
|
|
|
|
void printAllUniqueParts(int n)
|
|
{
|
|
int p[n];
|
|
int k = 0;
|
|
p[k] = n;
|
|
while (true)
|
|
{
|
|
printArray(p, k + 1);
|
|
int rem_val = 0;
|
|
while (k >= 0 && p[k] == 1)
|
|
{
|
|
rem_val += p[k];
|
|
k--;
|
|
}
|
|
if (k < 0)
|
|
return;
|
|
p[k]--;
|
|
rem_val++;
|
|
while (rem_val > p[k])
|
|
{
|
|
p[k+1] = p[k];
|
|
rem_val = rem_val - p[k];
|
|
k++;
|
|
}
|
|
p[k+1] = rem_val;
|
|
k++;
|
|
}
|
|
}
|
|
|
|
/*
|
|
* Main
|
|
*/
|
|
int main()
|
|
{
|
|
int value;
|
|
while(1)
|
|
{
|
|
cout<<"Enter an Integer(0 to exit): ";
|
|
cin>>value;
|
|
if (value == 0)
|
|
break;
|
|
cout << "All Unique Partitions of "<<value<<endl;
|
|
printAllUniqueParts(value);
|
|
cout<<endl;
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
/*
|
|
Enter an Integer(0 to exit): 2
|
|
All Unique Partitions of 2
|
|
2
|
|
1 1
|
|
|
|
Enter an Integer(0 to exit): 3
|
|
All Unique Partitions of 3
|
|
3
|
|
2 1
|
|
1 1 1
|
|
|
|
Enter an Integer(0 to exit): 4
|
|
All Unique Partitions of 4
|
|
4
|
|
3 1
|
|
2 2
|
|
2 1 1
|
|
1 1 1 1
|
|
|
|
Enter an Integer(0 to exit): 5
|
|
All Unique Partitions of 5
|
|
5
|
|
4 1
|
|
3 2
|
|
3 1 1
|
|
2 2 1
|
|
2 1 1 1
|
|
1 1 1 1 1
|
|
|
|
Enter an Integer(0 to exit): 7
|
|
All Unique Partitions of 7
|
|
7
|
|
6 1
|
|
5 2
|
|
5 1 1
|
|
4 3
|
|
4 2 1
|
|
4 1 1 1
|
|
3 3 1
|
|
3 2 2
|
|
3 2 1 1
|
|
3 1 1 1 1
|
|
2 2 2 1
|
|
2 2 1 1 1
|
|
2 1 1 1 1 1
|
|
1 1 1 1 1 1 1
|
|
|
|
Enter an Integer(0 to exit): 0
|