生成10000000~99999999 用户会员号 要求: 1.剔除豹子号,例如其中含有 666,555,888 2.所有数字中不能有4 3.剔除连号567,123,678等 4.输出时乱序不要连号 5.需要考虑内存消耗
时间: 2023-11-28 18:50:48 浏览: 66
这是一个比较有挑战性的问题,需要考虑到很多方面,包括内存消耗、时间复杂度等。下面是一种可能的解决方案:
1. 生成所有可能的用户会员号,即10000000~99999999之间的所有数字。
2. 对于每一个数字,判断是否符合要求。具体地:
- 剔除豹子号:如果该数字中含有666、555或888,则跳过,继续处理下一个数字。
- 剔除数字4:如果该数字中含有4,则跳过,继续处理下一个数字。
- 剔除连号:如果该数字中含有567、123或678,则跳过,继续处理下一个数字。
- 输出时乱序:将符合要求的数字保存到一个数组中,然后打乱数组顺序,最后输出。
3. 最后输出符合要求的数字。
下面是一份可能的代码实现,其中使用了set来保存需要剔除的数字,使用了vector来保存符合要求的数字,最后使用了洗牌算法对vector进行乱序输出:
```cpp
#include <iostream>
#include <vector>
#include <set>
#include <algorithm>
#include <random>
using namespace std;
int main()
{
// 生成所有可能的用户会员号
vector<int> nums;
for (int i = 10000000; i <= 99999999; ++i) {
nums.push_back(i);
}
// 剔除豹子号、数字4和连号
set<int> blacklist = { 666, 555, 888, 4, 567, 123, 678 };
vector<int> valid_nums;
for (auto num : nums) {
int digit1 = num % 10;
int digit2 = (num / 10) % 10;
int digit3 = (num / 100) % 10;
int digit4 = (num / 1000) % 10;
int digit5 = (num / 10000) % 10;
int digit6 = (num / 100000) % 10;
int digit7 = (num / 1000000) % 10;
int digit8 = (num / 10000000) % 10;
if (blacklist.count(digit1) || blacklist.count(digit2) || blacklist.count(digit3) ||
blacklist.count(digit4) || blacklist.count(digit5) || blacklist.count(digit6) ||
blacklist.count(digit7) || blacklist.count(digit8)) {
continue;
}
valid_nums.push_back(num);
}
// 打乱顺序输出
random_device rd;
mt19937 g(rd());
shuffle(valid_nums.begin(), valid_nums.end(), g);
for (auto num : valid_nums) {
cout << num << endl;
}
return 0;
}
```
需要注意的是,上述代码中可能会占用比较多的内存,因为需要保存所有可能的用户会员号和符合要求的数字。如果想要优化内存消耗,可以考虑使用生成器模式来逐个生成数字,并在生成数字的过程中进行判断和处理。
阅读全文