如何在这个程序中避免无限循环

How to avoid infinite loop in this program

本文关键字:无限循环 程序      更新时间:2023-10-16

我正在尝试解决c++中的3n+1问题。我想成对输入,并计算其最大周期长度,然后输出。

I/P: 1 10
     100 200
     201 210
     900 1000
O/P: 1 10 25
     100 200 125
     201 210 89
     900 1000 174
代码:

#include<iostream>
using namespace std;
int clen(int i)
{
    int len=1;
    while(i!=1)
    {
        len++;
        if(i%2==0)
            i/=2;
        else
            i=3*i+1;
    }
    return len;
}
int maxclen(int a, int b)
{
    int i,len,maxlen=0;
    for(i=a;i<=b;i++)
    {
        len=clen(i);
        if(len>maxlen)
            maxlen=len;
    }
    return maxlen;
}
main()
{
    int b[10][2],l,i,len[10];
    for(i=0;;i++)
    {
        cin>>b[i][0];
        if(cin.fail())
        {
            cin.clear();
            goto a;
        }
        cin>>b[i][1];
        if(cin.fail())
            goto a;
    }
    a:
    l=i;
    for(i=0;i<=l;i++)
    {
        if(b[i][1]>b[i][0])
            len[i]=maxclen(b[i][0],b[i][1]);
        else
            len[i]=0;
    }
    for(i=0;i<l;i++)
        cout<<b[i][0]<<" "<<b[i][1]<<" "<<len[i]<<endl;
}

我想停止输入每当cin.fail()返回true,但它的工作为几个程序的第一次执行,但在那之后,它进入一个无限循环输入数字,它只是不能出来。有人能帮我解决这个问题吗,我怎么才能避免这个无限循环?

我发现如果你只输入一个数字就按ctrl+d (eof)它就死机了

也许可以尝试在这里添加另一个'clear'错误状态:

main()
{
    int b[10][2],l,i,len[10];
    for(i=0;;i++)
    {
        cin>>b[i][0];
        if(cin.fail())
        {
            cin.clear();
            goto a;
        }
        cin>>b[i][1];
        if(cin.fail())
        {
            cin.clear(); // ADDED LINE
            goto a;
        }
    }
 ...

虽然我不能100%重现错误…这似乎对我的行为有所帮助。

也你的数组只有10长。也许它读得太多了,进入了某种奇怪的状态?

这里有一个差一的错误:

for(i=0;i<=l;i++)
{
  // ...
}

我像这样修改了你的main,以纠正几个问题:

int main()
{
    const size_t length = 10;
    int b[length][2], len[length];
    size_t i = 0;
    while(i < length)
    {
        cin >> b[i][0];
        if(!cin) break;
        cin >> b[i][1];
        if(!cin) break;
        ++i;
    }
    for(int j = 0; j < i; j++)
    {
        if(b[j][1] > b[j][0])
            len[j] = maxclen(b[j][0], b[j][1]);
        else
            len[j] = 0;
    }
    for(int j = 0; j < i; j++)
        cout << b[j][0] << " " << b[j][1] << " " << len[j] << endl;
}