【问题标题】:How to avoid infinite loop in this program如何避免此程序中的无限循环
【发布时间】:2012-01-23 06:32:19
【问题描述】:

我正在尝试解决 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 时停止输入输入,但它在程序的第一次执行中工作,但之后它进入无限循环以输入数字并且它无法退出。谁能帮我解决这个 cin 问题,我怎样才能避免这个无限循环?

【问题讨论】:

  • 这里不需要goto。请改用break
  • 这似乎与您的问题没有直接关系,但如果您将 b 声明为 10×2 数组,则应避免让 i 超过 9。
  • 感谢宝贵的 cmmnts..

标签: c++ cin


【解决方案1】:

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

也许尝试在那里添加另一个“清除”错误状态:

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 长 .. 可能它读取太多并进入一些奇怪的状态?

【讨论】:

    【解决方案2】:

    你这里有一个错误:

    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;
    }
    

    【讨论】:

      猜你喜欢
      • 2019-05-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-15
      相关资源
      最近更新 更多