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

C++ 即使循环中断(在命令行中),也会读取输入序列,c++,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=" << m

我如何处理这个问题

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;
}
我对这个问题的基本推断是, 这里输入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 3 5 < /代码>)作为一个单一的输入?

看起来你对错误的分析是正确的。 当您跳出循环时,未读输入将用于
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;
}
int要丢弃的数量=n-i;
for(int j=0;j<要丢弃的数量;++j)
{
cin>>a;
}
或者,如果您不想向任何想要调试代码的人透露太多线索,那么可以使用循环

for ( ; i < n; ++i)
(;i
对不起,我听不懂你在说什么。这是黑客银行的问题吗?链接?当您将值5赋给
n
时,您希望程序读取5个数字。当您更快地中断read+compute循环时,程序读取的值会更少。因此,您必须读取并丢弃剩余的数字。
for ( ; i < n; ++i)