没有重复的彩票计划功能

时间:2011-05-11 07:32:56

标签: c++ arrays

现在我正在尝试创建一个函数来检查用户的选择是否已经在数组中,如果它确实如此,则告诉您选择差异编号。我怎么能这样做?

5 个答案:

答案 0 :(得分:1)

你的意思是这样吗?

bool CheckNumberIsValid()
{
   for(int i = 0 ; i < array_length; ++i)
   {
      if(array[i] == user_selection)
         return false;
   }

   return true;
}

至少应该给你一个线索。

答案 1 :(得分:1)

std::find出了什么问题?如果你得到end迭代器,那么 值不在数组中;否则就是。或者如果这是家庭作业, 你不被允许使用标准库,一个简单的while循环 应该做的诀窍:这是一个标准的线性搜索,算法 可以在任何地方找到。 (另一方面,一些文章 在使用Google搜索时弹出的内容非常糟糕。你真的 应该使用标准实现:

Iterator
find( Iterator begin, Iterator end, ValueType target )
{
    while ( begin != end && *begin != target )
        ++ begin;
    return begin;
}

简单,有效,并证明有效。)

答案 2 :(得分:1)

[添加 post factum ]哦,作业标签。好吧,那么它不会给你带来太大的好处,但是 - 我会留下我的答案,因为它可以对浏览SO的其他人有所帮助。

如果你需要在一个范围内有很多独特的随机数 - 比如来自0..45100的45000个随机数 - 那么你应该看看这会如何使用以下方法产生问题:

while (size_of_range > v.size()) {
    int n = // get random
    if ( /* n  is not already in  v */ ) {
        v.push_back(n);
    } 
}

如果池的大小和你想要获得的范围很接近,并且池大小不是一个非常小的整数 - 那么获取一个尚未放入的随机数会变得越来越难。矢量/阵列。 在这种情况下,您可以更好地使用std::vector(在<vector>)和std::random_shuffle(在<algorithm>中):

unsigned short start = 10; // the minimum value of a pool
unsigned short step = 1; // for 10,11,12,13,14... values in the vector
// initialize the pool of 45100 numbers
std::vector<unsigned long> pool(45100);
for (unsigned long i = 0, j = start; i < pool.size(); ++i, j += step) {
    pool[i] = j;
}
// get 45000 numbers from the pool without repetitions
std::random_shuffle(pool.begin(), pool.end());
return std::vector<unsigned long>(pool.begin(), pool.begin() + 45000);

您显然可以使用任何类型,但您需要相应地初始化向量,因此它包含您想要的所有可能值。

请注意,如果您确实需要池中的几乎所有数字,那么内存开销可能并不重要,您将获得良好的性能。使用rand()并进行检查将花费大量时间,如果RAND_MAX等于32767,那么它将是一个无限循环。 但是,如果您只需要很少的值,则内存开销会很明显。第一种方法通常会更快。

答案 3 :(得分:0)

如果它确实需要是数组,则需要迭代或使用算法头中的find函数。好吧,我建议你把数字放在一个集合中,因为查找速度很快,使用set :: find函数

参考:stl set

答案 4 :(得分:0)

这些是关于如何解决这些问题的一些步骤(伪代码,因为这是一个家庭作业问题):

  1. 让用户输入新号码。
  2. 如果输入的数字是第一个,请将其推送到矢量。
  3. 在大小为&gt;的情况下对向量的内容进行排序1.
  4. 要求用户输入号码。
  5. 对内容执行二进制搜索以查看是否输入了数字。
  6. 如果数字是唯一的,请将其推入向量。如果不是唯一的,请再次询问。
  7. 转到第3步。
  8. HTH,
    斯利拉姆。