Оптимизация времени с помощью C? В простом алгоритме считывания входных данных

#c #optimization #time

#c #оптимизация #время

Вопрос:

Я читаю файл с заданным форматом, поэтому я вроде как знаю, чего ожидать от файла, однако, когда я пытаюсь распечатать все входные данные, просто чтобы убедиться, что код работает, консоль вылетает с исключением тайм-аута. У меня есть вложенный цикл for, поскольку я нахожу его самым простым способом обработки формата файла. Но я не знаю, есть ли лучший способ справиться с этим.

Проблема заключается в том, что кодирование для гиков является сложной задачей. Я заметил, что когда я изменяю использование переменной for в цикле for, код компилируется, но таким образом я не смог бы обрабатывать разные форматы файлов. Пока у меня есть константа в цикле for в качестве моего параметра, он выполняется. Есть идеи относительно того, почему это так?

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

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

 #include <stdio.h>
#include <ctype.h>
int nextInt();
int main() {
    int c = getchar() - '0';
    printf("%dn", c);
    while(c > 0){
        int x, y;
        x = nextInt();
        y = nextInt();
        printf("%dMn", x, y);
        int i, a, b;
        for(i = 0;i<2*y; i  ){
            a = nextInt();
            printf("M", a);
        }
        printf("n");
        c--;
    }
    return 0;
}

int nextInt(){
    int c, n;
    int num;
    while(isspace(c=getchar())){;}
    num = c - '0';
    while(!isspace(n = getchar())){
        num = (num * 10)   (n - '0');
    }
    return num;
}
  

Пример ввода выглядит примерно так:

 2
4 4 
0 2 0 3 1 3 2 3
4 3 
0 2 0 1 0 3
  

вывод

 4
3
  

Комментарии:

1. Это не имеет ничего общего с оптимизацией. Вам нужно использовать отладчик, чтобы выяснить, почему ваш код не функционирует должным образом. Как только он заработает и выдаст правильный результат, вы можете приступить к его оптимизации, когда определите конкретное узкое место. Это не оптимизация, когда вы пытаетесь заставить код действительно работать — это называется отладкой.

2. Скорее всего, вы переходите в бесконечный цикл.

3. Есть ли веская причина, по которой вы написали свой собственный код для разбора чисел вместо использования scanf() ?

4. Как вы запускаете свой код? Похоже, что он должен правильно прочитать хотя бы ваш пример файла. Даже если вы не обрабатываете многие условия ошибки, как упоминает @Barmar

5. @bruceg Если последняя строка не заканчивается новой строкой, она перейдет в бесконечный цикл поиска пробельного символа для завершения последнего числа.

Ответ №1:

while Цикл в nextInt() не останавливается при считывании EOF. Если последняя строка не заканчивается новой строкой, вы перейдете в бесконечный цикл, потому что он никогда не найдет разделитель после последнего числа.

 int nextInt(){
    int c, n;
    int num;
    while(isspace(c=getchar())){;}
    num = c - '0';
    while(!isspace(n = getchar()) amp;amp; n != EOF){
        num = (num * 10)   (n - '0');
    }
    return num;
}