2015-05-09 41 views
-1

如何處理此問題?即使循環中斷(在命令行中),也會讀取輸入序列

while(ntestcase--) 
{ 
    int i, n, max; 
    cin >> n; 

    for(i = 0; i < n; i++) 
    { 
     cin >> a; 

     if(a >= 2) 
      max += 2; 
     else 
      break; 
    } 

    cout << "max=" << max << " n=" << n << " i=" << i << "\n"; 

    if(i == n && max != 0) 
     cout << max << "\n"; 
    else 
     cout << -1; 
} 

考慮輸入

ntestcase=3 
n=5 
as a's 
1 2 3 4 5 

我對這個問題的基本推論是, 這裏5個的要進入,但是當遇到1環斷裂並給出輸出。 有從相同的輸入2被認爲是用於下一個測試案例 「n」和a的作爲3,4和輸出之後,並給出,則n爲5。

產生的輸出是有些這樣的:

max=0 n=5 i=0 
-1 
max=4 n=2 i=2 
4 

我怎樣才能解決這個問題,並考慮序列(例如:1 2 3 4 5)作爲一個單一的輸入?

+5

對不起,我不知道你在說什麼。 –

+0

這是一個Hackerrank問題嗎?鏈接? –

回答

0

看起來你對錯誤的分析是正確的。 當您跳出循環時,用於當前迭代while(ntestcase--)的 當前迭代的未讀輸入剩餘,並且將 用作下一次迭代的輸入。

我可能會寫所有這些代碼都非常不同,如果我是 寫我自己的程序(一兩件事,我會避免使用相同的變量i數都多少次a從輸入閱讀其中有多少是第一個值小於2)之前,但在你已經選擇的風格繼續:

while(ntestcase--) 身體的末尾添加另一個for循環來消耗該迭代的休息沒有做任何其他的輸入。 從輸入值 消耗n - i值,然後您將準備好接下來的迭代while(ntestcase--)

例如,這可能會做的工作:

int how_many_to_discard = n - i; 
for (int j = 0; j < how_many_to_discard; ++j) 
{ 
    cin >> a; 
} 

或者,如果你不想放棄太多的線索的人誰可能要調試代碼,循環可以替換爲

for (; i < n; ++i) 
+0

你能讓它更清楚一點嗎? – user304755

+1

當您將值5賦給'n'時,您希望程序讀取5個數字。 由於您較早破壞了讀取+計算循環,程序讀取的值較小。所以你必須閱讀+丟棄剩餘的數字。 –