即使循环中断(在命令行中)也会读取输入序列

时间:2015-05-09 14:08:17

标签: c++

我该如何处理这个问题?

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个a,但是遇到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)视为单个输入?

1 个答案:

答案 0 :(得分:0)

看起来您对错误的分析是正确的。 当你突破循环时,未读的输入用于 while(ntestcase--)的当前迭代遗留下来并且是 用作下一次迭代的输入。

如果是的话,我可能会以非常不同的方式编写所有这些代码 编写我自己的程序(首先,我会避免使用相同的变量i来计算从输入读取a的次数和这些变量中有多少次在第一个值小于2)之前,但要继续使用您已选择的样式:

for正文的末尾添加另一个while(ntestcase--)循环 在不做任何其他事情的情况下消耗剩余的迭代输入。 从输入中获取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)