2016-01-25 23 views
-1

我發現爲了讓猜測者猜到100,我需要將最大值設置爲100。我很困惑,因爲如果最大的東西是100,那不包括100?我的代碼有問題嗎?誰能解釋一下? Noob在這裏尋找一些幫助。非常感謝! 下面是代碼:爲什麼我需要將最大值設置爲101才能讓我的基本猜測程序猜到100?

#include <iostream> 
using namespace std; 

char yes_or_no; 
int guess = 0; 

void guesser(int we_are_on, int max, int min) 
{ 
    cin >> yes_or_no; 
    if (yes_or_no == 'y') 
    max = we_are_on; 
    else if (yes_or_no == 'n') 
    min = we_are_on; 
    else 
    cout << "Bad Input!\n"; 
    cout << "Max: " << max << " Min: " << min << " Running Guess: " << we_are_on; 
    we_are_on = min + ((max-min)/2); 
    cout << "\nIs your number less than " << we_are_on << '?'; 
    if (max - min <= 1) 
    { 
    guess = we_are_on; 
    return; 
    } 
    guesser(we_are_on, max, min); 
} 

int main() 
{ 
    cout << "Is your number less than 50?"; 
    guesser(50, 101, 1); 
    cout << "\n Your number is " << guess; 
    return 0; 
} 
+1

這聽起來像你可能需要學習如何使用調試器來遍歷你的代碼。使用一個好的調試器,您可以逐行執行您的程序,並查看它與您期望的偏離的位置。如果你打算做任何編程,這是一個重要的工具。進一步閱讀:** [如何調試小程序](http://ericlippert.com/2014/03/05/how-to-debug-small-programs/)** – NathanOliver

回答

1

這將是因爲整數截斷。

we_are_on= min + ((max-min)/2); 

來解決這一問題的大量涌現,使得max = 100min = 50,我們得到:現在

we_are_on= 50 + ((max-min)/2); 
     = 50 + ((100 - 50)/ 2); 
     = 75 

,如果這個猜測是錯誤的,我們繼續走高,那麼出現這種情況:

guesser(75, 100, 1); 
we_are_on= 75 + ((100-75)/2); 
     = (int) 87.5 
     = 87 

guesser(87, 100, 1); 
we_are_on= 87 + ((100-87)/2); 
     = (int) 93.5 
     = 93 

guesser(93, 100, 1); 
we_are_on= 93 + ((100-93)/2); 
     = (int) 96.5 
     = 96 

guesser(96, 100, 1); 
we_are_on= 96 + ((100-96)/2); 
     = 98 

guesser(98, 100, 1); 
we_are_on= 98 + ((100-98)/2); 
     = 99 

guesser(99, 100, 1); 
we_are_on= 99 + ((100-99)/2); 
     = (int) 99.5 
     = 99 
// And therefore... 
guesser(99, 100, 1); // ad infinitum 

還有你的問題。如果您直接將結果保存到int中,則小數部分將被完全截斷,而不是四捨五入。如果你只是想要一個快速修復的問題,你可以讓它檢查另一個特殊情況。

if (min == 99) { 
    guess = 100; 
} else if (max - min <= 1) { 
    guess = we_are_on; 
} else { 
    guesser(we_are_on, max, min); 
} 

我相信應該有效。


編輯:達恩,StillLearning擊敗了我。

+0

謝謝你們兩人的支持題。我真的很感激它,很好的解釋。我永遠不會忘記這個珍聞! –

+0

不客氣。如果您遇到算法問題,手動解決它有時會很有幫助;您可能會以這種方式查看導致問題的原因。另外,如果你想舍入一個值而不是僅僅截斷,你可以看看std :: round():http://www.cplusplus。com/reference/cmath/round /(注意,如果它們不完全符合C++ 11標準,它可能不適用於較早的編譯器。) –

2

考慮max = 100min=99

,這一行

we_are_on= min + ((max-min)/2); 

we_are_on= 99 + ((100-99)/2) = 99 + (1/2) = 99 + 0 = 99 

,所以你不能達到100

問題是整數除法的結果總是被截斷。

如果你想四捨五入整數除法,你必須在第一個除數上加上一半。

實施例:

int x = 16; 
int y = 10; // must be an equal number in this example 
int z = x/y; // z is 1 due to truncation 
int w = (x + y/2)/y; // add y/2 before division with y => w is 2, i.e. rounding 
相關問題