因此,以下程序会在此主字符串中生成字符组合,您将在程序中看到这些组合。首先程序生成所有的 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;
}