簡體   English   中英

如何避免此程序中的無限循環

[英]How to avoid infinite loop in this program

我正在嘗試解決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),它就會死亡。

也許嘗試在此處添加另一個“清除”錯誤狀態:

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++)
{
  // ...
}

我像這樣修改了您的主體,以解決幾個問題:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM