2011-12-19 5 views
2

Я пытаюсь решить проблему 3n + 1 в C++. Я хочу взять вход парами и вычислить его максимальную длину цикла, а затем вывести его.Как избежать бесконечного цикла в этой программе

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() возвращает истину, но его работы в течение нескольких первых выполнения программы, но после того, что она входит в бесконечный чтобы ввести цифры, и он просто не может выйти. Может ли кто-нибудь помочь мне по этой проблеме cin, Как я могу избежать этого бесконечного цикла?

+5

Нет необходимости 'goto' здесь. Вместо этого используйте 'break'. – Pubby

+0

Это, похоже, не связано напрямую с вашей проблемой, но если вы объявляете 'b' как массив 10 × 2, вы должны избегать того, чтобы' i' расти до 9. – jwodder

+0

Спасибо за ценные cmmnts .. –

ответ

0

У вас ошибка вне по одному здесь:

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

действительно классное решение .. Спасибо –

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. Возможно, он слишком много читает и переходит в какое-то странное состояние?

+0

Thankyou очень ... –