如何生成九位数的数字,其中每个数字互不相同

时间:2018-06-20 01:08:37

标签: c++ algorithm

我正在编写程序,我需要生成所有9位数字,每个数字都与其他数字不同,在这种情况下0不是有效数字,因此我只考虑1到9之间的数字。

到目前为止,我已经有了使用随机数生成的解决方案,但是我遇到了性能问题

using namespace std;
#include <iostream>
#include <stdlib.h>
#include <time.h>
#include <vector>
#include <string>
#include <map>

int main()
{
    srand (time(NULL));

    int secret;
    string number = "";

    map <string, bool> m;
    int count = 0;

    int nine_permutation = 362880;

    vector <int> v{0,1,2,3,4,5,6,7,8,9};
    int x = 9;

    while(count < nine_permutation)
    {
      for(int i = 0; i < 9; i++)
      {
          secret = rand() % x +1;
          number += to_string(v[secret]);
          v.erase(v.begin() + secret);

          x--;
      }
      x = 9;
      v = {0,1,2,3,4,5,6,7,8,9};
      if(m.count(number) == 0)
      {
        m[number] = true;
        count ++;
      }


      cout << count << endl;
    }


    cout << number;
}

1 个答案:

答案 0 :(得分:1)

因此,您有10位数字0,1,2,3,4,5,6,7,8,9和数字,您希望获得9位数字。 我认为您可以从123456789开始,生成所有排列,然后将每个字符替换为'0',这将给定值: {023456789, 103456789, 120456789, 123056789, 123406789, 123450789, 123456089, 123456709, 123456780}。对于此集合中的每个元素,还生成所有排列。 像这样:

void allNumbersWithDistinctDigits() {
    int idxForZero = 0;
    std::string initial("123456789");

    std::string local(initial);
    do {
        while (std::next_permutation(local.begin(), local.end())) {
            if (local[0] != '0') {
                std::cout << local << std::endl;
            }
        }
        local = initial;
        local[idxForZero] = '0';
    } while(++idxForZero <= initial.size());

}

条件if (local[0] != '0')是可选的,它去除了以0开头的数字,例如:012345678实际上是8位数字12345678或八进制数字。