fork download
  1. #include <vector>
  2. #include <string>
  3. #include <iostream>
  4. #include <iomanip>
  5.  
  6. using namespace std;
  7.  
  8. class Gray
  9. {
  10. public:
  11. Gray(int N):N(N),a(N+1,false),last_(-1){}
  12. ~Gray() = default;
  13. Gray(const Gray&) = default;
  14. Gray(Gray&&) = default;
  15. Gray& operator=(const Gray&) = default;
  16. Gray& operator=(Gray&&) = default;
  17.  
  18. size_t size() const { return N; }
  19. void reset(size_t newN = 0)
  20. {
  21. if (newN) N = newN;
  22. vector<bool> b(N+1,false);
  23. std::swap(a,b);
  24. last_ = -1;
  25. }
  26.  
  27. bool operator[](size_t idx) const { return a[idx]; }
  28.  
  29. int last() const { return last_; }
  30.  
  31. bool next()
  32. {
  33. size_t j;
  34. if (!a[N]) j = 0; else {
  35. for(j = 0; j < N; ++j) if (a[j]) break;
  36. ++j;
  37. }
  38. if (j == N) return false;
  39. a[N] = !a[N];
  40. a[j] = !a[j];
  41. last_ = j;
  42. return true;
  43. }
  44. private:
  45. vector<bool> a;
  46. size_t N;
  47. int last_;
  48. };
  49.  
  50.  
  51.  
  52. int main(int argc, const char * argv[])
  53. {
  54. int m[] = { 2, 3, 5, 7 };
  55.  
  56. Gray g(sizeof(m)/sizeof(m[0]));
  57. do {
  58. if (g.last() >= 0)
  59. {
  60. int p = 1;
  61. for(size_t i = 0; i < g.size(); ++i) if (g[i]) p *= m[i];
  62. cout << setw(6) << p << " = ";
  63. for(size_t i = 0, first = 1; i < g.size(); ++i)
  64. if (g[i]) {
  65. if (!first)
  66. {
  67. cout << " * ";
  68. }
  69. else
  70. {
  71. first = 0;
  72. }
  73. cout << m[i];
  74. }
  75. cout << "\n";
  76. }
  77. } while(g.next());
  78.  
  79. // Только произведения - если нет нулевого элемента.
  80.  
  81. g.reset();
  82.  
  83. int p = 1;
  84. do {
  85. if (g.last() >= 0)
  86. {
  87. if (g[g.last()]) p *= m[g.last()]; else p /= m[g.last()];
  88. cout << setw(6) << p <<"\n";
  89. }
  90. } while(g.next());
  91.  
  92. }
  93.  
Success #stdin #stdout 0s 3468KB
stdin
Standard input is empty
stdout
     2 = 2
     6 = 2 * 3
     3 = 3
    15 = 3 * 5
    30 = 2 * 3 * 5
    10 = 2 * 5
     5 = 5
    35 = 5 * 7
    70 = 2 * 5 * 7
   210 = 2 * 3 * 5 * 7
   105 = 3 * 5 * 7
    21 = 3 * 7
    42 = 2 * 3 * 7
    14 = 2 * 7
     7 = 7
     2
     6
     3
    15
    30
    10
     5
    35
    70
   210
   105
    21
    42
    14
     7