我正在编写程序,我需要生成所有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;
}
答案 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
或八进制数字。