C++ 如何生成每个数字都不同于其他数字的九位数数字
我正在制作一个程序,我需要生成所有9位数字,每个数字与其他数字不同,在这种情况下,0不是有效数字,因此我只考虑从1到9的数字 到目前为止,我使用随机数生成解决方案,但我面临性能问题C++ 如何生成每个数字都不同于其他数字的九位数数字,c++,algorithm,C++,Algorithm,我正在制作一个程序,我需要生成所有9位数字,每个数字与其他数字不同,在这种情况下,0不是有效数字,因此我只考虑从1到9的数字 到目前为止,我使用随机数生成解决方案,但我面临性能问题 using namespace std; #include <iostream> #include <stdlib.h> #include <time.h> #include <vector> #include <string> #include <m
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;
}
使用名称空间std;
#包括
#包括
#包括
#包括
#包括
#包括
int main()
{
srand(时间(空));
int秘密;
字符串编号=”;
地图m;
整数计数=0;
int-nine_置换=362880;
向量v{0,1,2,3,4,5,6,7,8,9};
int x=9;
while(计数<九次排列)
{
对于(int i=0;i<9;i++)
{
secret=rand()%x+1;
数字+=到_字符串(v[secret]);
v、 擦除(v.begin()+秘密);
x--;
}
x=9;
v={0,1,2,3,4,5,6,7,8,9};
如果(m.计数(数字)==0)
{
m[数字]=真;
计数++;
}
cout所以你有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());
}
void allnumberswithdistinctdigts(){
int idxForZero=0;
std::字符串首字母(“123456789”);
std::字符串本地(首字母);
做{
while(std::next_置换(local.begin(),local.end()){
如果(本地[0]!=“0”){
std::cout什么性能问题;你在哪里发现了瓶颈?程序在大约43000个数字后突然停止生成。然后它崩溃了,我不得不通过任务管理器将其关闭,因为窗口完全冻结。可能重复读取关于std::next\u permutation
。随机生成所有排列将花点时间-尤其是使用rand
和`%,因为你的随机数字不是均匀分布的。要有系统,而不是随机的。