Проект Эйлера - Задача 22: Отклонить на 3,35 процента - PullRequest
0 голосов
/ 12 июля 2019

Я попытался решить Задачу 22 * ​​1002 * Project Euler, сначала отсортировав имена с помощью реализации пузырьковой сортировки, а затем добавив оценки всех вместе, используя циклы FOR.Пример «COLIN» работает нормально, а также работают и другие случайные оценки.Но общая сумма неверна.

Я искал похожие вопросы 22 на StackOverFlow и похожих сайтах кодирования вопросов и ответов, однако, похоже, что большинство людей используют python, R или C #.Я могу решить эту проблему в Python с помощью библиотек, но я хотел учиться, поэтому я попытался сделать это в C, но это не удается.PS Я относительно новичок в программировании, но я сомневаюсь, что моя плохо реализованная пузырьковая сортировка вызывает проблему.Проблема в том, что я пытался разместить операторы printf во многих местах, но все еще не могу понять, где я ошибаюсь.

    FILE *file;
    char list[46448];

    file = fopen("/home/USER_NAME/Downloads/p022_names.txt", "r");
    fscanf(file, "%s", list);

    char *tok = strtok(list, ",");
    char *token[5163];
    token[0] = tok;
    int i = 1;
    char *temp;

    while (tok != NULL){
        tok = strtok(NULL, ",");
        token[i] = tok;
        i++;
    }

    for(int j = 5162; j >= 0; j--){ 
        for(int i = 0; i < j; i++){
            if(strcmp(token[i], token[i + 1]) > 0){
                temp = token[i];
                token[i] = token[i + 1];
                token[i + 1] = temp;
            }   
        }
    }

    char str[20];
    int sum;
    int score = 0;

    for(int z = 0; z < 5163; z++){
        sum = 0;
        strcpy(str, token[z]);
        for(int i = 0; i < 20; i++){
            if((str[i] != '\"') & (str[i] != 0)){
                sum += str[i] - 64;
            }
        }
        score += (sum * (z + 1));
        }
    printf("Names Score: %d\n", score);
}   

Тем не менее, я постоянно получаю неправильный ответ 900429178.Правильный ответ 871198282.

1 Ответ

1 голос
/ 12 июля 2019

Цикл for(int i = 0; i < 20; i++) не может остановиться, когда заканчивается запись. Непосредственно перед этим циклом token[z] копируется в str. Эта копия останавливается на нулевом байте, который заканчивается token[z]. Помимо этого, он оставляет в str все, что было раньше.

Затем цикл for(int i = 0; i < 20; i++) добавляет значения для всех букв без кавычек и ненулевых символов в str, включая буквы, оставшиеся от предыдущих длинных имен.

Этот цикл следует изменить, чтобы он останавливался там, где заканчивается текущее имя.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...