我的程序编写每十亿个组合的更有效方法是什么?

use*_*947 7 c++ combinations permutation combinatorics

因此,以下程序会在此主字符串中生成字符组合,您将在程序中看到.首先程序生成所有48个选择12个组合,然后一直到48个选择19.

问题是组合的总数是65万亿,这在合理的时间内无法计算.我想,"好吧,好吧,我将把每十亿分之一写入文件." 那么,这也需要花费大量的时间,因为该计划仍然需要达到65万亿,即使它只写了每十亿个组合.

有什么我可以在我的程序中修改,以避免这必须计入一个非常大的数字,但仍然写入每十亿个组合到一个文件?

#include <iostream>
#include <string>
#include <iostream>
#include <fstream>
#include <vector>

using namespace std;

template <typename Iterator>
bool next_combination(const Iterator first, Iterator k, const Iterator last)
{
   if ((first == last) || (first == k) || (last == k))
      return false;
   Iterator i1 = first;
   Iterator i2 = last;
   ++i1;
   if (last == i1)
      return false;
   i1 = last;
   --i1;
   i1 = k;
   --i2;
   while (first != i1)
   {
      if (*--i1 < *i2)
      {
         Iterator j = k;
         while (!(*i1 < *j)) ++j;
         std::iter_swap(i1,j);
         ++i1;
         ++j;
         i2 = k;
         std::rotate(i1,j,last);
         while (last != j)
         {
            ++j;
            ++i2;
         }
         std::rotate(k,i2,last);
         return true;
      }
   }
   std::rotate(first,k,last);
   return false;
}

unsigned long long count = 0;

int main()
{
  ofstream myfile;
  myfile.open ("m = 8.txt");

  string s = "ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnop";

  for (int i = 12; i <= 19; i++)
  {
    std::size_t comb_size = i;

    do
    { 
      if (count == 0)
        myfile << std::string(s.begin(),s.begin() + comb_size) << std::endl;

      if (++count % 1000000000 == 0)
        myfile << std::string(s.begin(),s.begin() + comb_size) << std::endl;

    }while(next_combination(s.begin(),s.begin()+ comb_size,s.end()));
  }

  myfile.close();

  cout << "Done!" << endl;

  system("PAUSE");
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

小智 -1

如果你不在乎实际计数是多少,你可以使用 32 位 int,它仍然会让你知道你达到了 10 亿。