UVA Online Judge: невоспроизводимая ошибка времени выполнения - PullRequest
0 голосов
/ 18 марта 2020

Мой код скомпилирован (g ++) без ошибок и без ошибок запущен в моей системе (Macos) для выборочного ввода с веб-сайта, но показывает ошибку времени выполнения в онлайн-оценке. Пожалуйста, помогите, я новый программист. Это - формулировка проблемы.

Моя программа возвращает правильные результаты для входных данных теста.

Они не указали точную причину ошибки времени выполнения. Веб-сайт содержит следующую информацию об ошибке времени выполнения:

Ошибка времени выполнения (RE): во время выполнения произошла ошибка вашей программы (ошибка сегментации, исключение с плавающей запятой ...). Точная причина не сообщается пользователю, чтобы избежать взлома. Убедитесь, что ваша программа возвращает в оболочку код 0.

#include <iostream>
#include <vector>
#include <algorithm>
#include <string>
#include <sstream>


using namespace std;

int main(){

    string line;

     while(getline( cin,line) && line != "" ){

         istringstream split(line);

         string kt,jt;

         getline(split, kt, ' ');
         getline(split, jt);


         int k = stoi(kt);
         int j = stoi(jt); 



        vector<int> all_cycles;

        for(int i = k; i<= j; i++){

            vector<int> cycle ;

            int temp  = i;

            while(temp != 1){

                cycle.push_back(temp);

                if(temp %2 == 0) temp = temp /2;

                else temp = (temp*3) + 1;

            }
            all_cycles.push_back(cycle.size() + 1 );
            cycle.clear();

        }       





        cout << k << " " << j << " " << *max_element(all_cycles.begin(), all_cycles.end())  << "\n";
        all_cycles.clear();

    }





    return 0;
}

Обновление кода 1:

Заменены векторы на счетчики.

Исправлено неопределенное поведение, если j

Отправлен обновленный код, но ошибка выполнения проблема обнаружения путем копирования следующего символа ввода из потокового буфера в переменную и проверки, является ли это символом новой строки.

Этот обновленный код, похоже, избавился от ошибки времени выполнения, и теперь это ошибка вывода. Что я должен быть в состоянии решить путем форматирования моего вывода. Таким образом, кажется, что стои в моем предыдущем коде могли вызывать исключение во время выполнения. Спасибо @walnut за указание на это.

#include <iostream>


using namespace std;

int main(){

    int k, j;
    int eofile = 0;

     while(cin >> k >> j && !eofile ){


        streambuf * pbuf = cin.rdbuf();
        char ch = pbuf->snextc();
        if(ch == '\n')  eofile = 1;

        if(k > j) {
            int t = k;
            k = j;
            j = t;
        }

        int max_cycle = 0;

        for(int i = k; i<= j; i++){

            int  cycle = 1 ;
            int temp  = i;

            while(temp != 1){

                cycle++;

                if(temp %2 == 0) temp = temp /2;

                else temp = (temp*3) + 1;
            }
            if(cycle > max_cycle) max_cycle = cycle;
        }       

        cout << k << " " << j << " " <<  max_cycle << "\n";
    }

    return 0;
}

Если есть лучший способ получить отформатированный ввод, а также обнаружить новую строку подскажите пожалуйста как это сделать.

1 Ответ

0 голосов
/ 19 марта 2020

Решена проблема:

Программа запустилась без каких-либо ошибок со временем выполнения: 0,330 с

Ошибка времени выполнения была решена, когда я заменил функцию stoi () на форматирование ввода.

Наконец, произошла ошибка вывода, потому что я переключал k и j, чтобы предотвратить неопределенное поведение при j

#include <iostream>
#include <string>
#include <sstream>


using namespace std;

int main(){

    string line;

     while(getline( cin,line) && line != "" ){

         istringstream split(line);
         int k,j;

        split >> k >> j; 

        int flip = 0;


        if(k > j) {
            flip = 1;
            int t = k;
            k = j;
            j = t;
        }


        int max_cycle = 0;

        for(int i = k; i<= j; i++){

            int  cycle = 1 ;
            int temp  = i;

            while(temp != 1){

                cycle++;

                if(temp %2 == 0) temp = temp /2;

                else temp = (temp*3) + 1;

            }
            if(cycle > max_cycle) max_cycle = cycle;

        }       

        if(!flip) cout << k << " " << j << " " <<  max_cycle << "\n";
        else cout << j << " " << k << " " <<  max_cycle << "\n";


    }
    return 0;
}

Спасибо всем за всем помочь.

...