[英]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.