在此程序中,我们将计算一个数字可以用小于其自身的数字之和表示的方式数量。该程序将计算给定数字的分区。我们以数字n作为输入,然后从一个数字开始,一次删除1来打断它。如果生成了新分区,请增加计数器。
输入:数字n
输出:分区数
Begin Create array p of size n k := 0 count := -1 put n as the first element of array p Repeat the following steps, do increase count by 1 rem := 0 while k >= 0 and p[k] = 1, do rem := rem + p[k] decrease k by 1 done if k < 0, then return count p[k] := p[k] – 1 rem := rem + 1 while rem >= p[k], do p[k+1] := p[k] rem := rem - p[k] increase k by 1 done p[k+1] := rem increase k by 1 done End
#include<iostream>
using namespace std;
int partitionCount(int n){ //used to count all possible partitions
   int p[n], k = 0, count = -1;
   p[k] = n; //add n as the first element of array
   while(true) { //repeat untill all elements are turned to 1
      count++;
      int rem = 0;
      while (k >= 0 && p[k] == 1){ // Move the pointer to the correct index where p[k] > 1.
         rem += p[k];
         k--;
      }
      if (k < 0) // If k < 0 then the all the element are broken down to 1.
         return count;
         //否则将值减少1,并增加rem-
         p[k]--;
         rem++;
      while (rem > p[k]) { // repeat until the number of 1's are greater than the value at k index.
         p[k+1] = p[k];
         rem -= p[k]; // Decrease the rem_val value.
         k++;
      }
      p[k+1] = rem; // Assign remaining value to the index next to k.
      k++;
   }
}
main() {
   int n, c;
   cout<<"Enter number for partition counting: ";
   cin>>n;
   if (n <= 0) { //n must be greater than or equal to 1
      cout<<"Invalid value of n";
      exit(1);
   }
   c = partitionCount(n);
   cout<<"The number of partitions: "<<c;
}输出结果
Enter number for partition counting: 7 The number of partitions: 14