2011-05-11 43 views

回答

1

你的意思是這樣的嗎?

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

    return true; 
} 

這應該給你一個線索,至少。

+1

爲什麼殘酷的力量?嘗試確定數組是否先排序,如果是,則二分法搜索將更有效率 – amit 2011-05-11 07:39:02

+0

@amit:因爲它是一個用戶界面。這個功能已經工作了幾千倍。 – TonyK 2011-05-11 07:46:42

+0

鑑於問題的背景以及它包含「作業」作爲標籤的事實,我認爲這是最直接的,因此也是適當的迴應。二進制搜索對於這裏所要求的內容是過分的,可能會讓他/她的老師感到困惑。 – acron 2011-05-11 07:46:59

0

如果確實需要數組,您需要迭代或使用算法頭的find函數。那麼,我建議你去把號一組作爲外觀上升快於集和方便的使用設置::發現功能

裁判:stl set

0

這些都是一些步驟(僞代碼,因爲這是一個作業問題),你可能會這樣做:

  1. 獲取用戶輸入一個新號碼。
  2. 如果輸入的數字是第一個,無論如何都將它推到矢量上。
  3. 在大小大於1的情況下對向量的內容進行排序。
  4. 要求用戶輸入數字。
  5. 對內容執行二進制搜索以查看是否輸入了數字。
  6. 如果數字是唯一的,則將其推入矢量中。如果不是唯一的,再問一次。
  7. 轉到步驟3

HTH,
斯利拉姆。

+0

哇 - 非常複雜 - 排序和二進制搜索有什麼意義 - 什麼是彩票號碼 - 最多6個數字?一個簡單的迭代很可能會更快。 – Nim 2011-05-11 08:12:57

+0

@Nim:如果沒有任何關於需要添加的數字的信息,這將是最通用的算法。當然,如果你認爲只有極少數的彩票號碼會被添加,你可能會失去排序和搜索部分。 – Sriram 2011-05-11 09:03:22

1

std::find有什麼不對?如果返回end迭代器,則 值不在數組中;否則,它是。或者如果這是作業,並且 你不允許使用標準庫,那麼一個簡單的while循環 應該做的竅門是:這是一個標準的線性搜索算法,可以在任何地方找到 。 (在另一方面,一些文章 與谷歌搜索時彈出的是相當糟糕,你真的 應使用標準執行:。

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

簡單,有效,並且證明工作)

1

[加了後事]哦,作業標籤。好吧,它不會真的讓你受益太多,但 - 我會留下我的答案,因爲它可以用於瀏覽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那麼它將是一個無限循環。 但是,如果您只需要這些值中的幾個,內存開銷就會顯着。第一種方法通常會更快。