почему мое решение проблемы 3n + 1 неверно - PullRequest
0 голосов
/ 29 августа 2011

Я недавно начал читать книгу С. Скиены "Проблемы программирования" и верю или нет, но я застрял в самой первой проблеме.

Вот ссылка на проблему: 3n +1 проблема

Вот мой код:

 #include <stdio.h>

long get_cycle(long input){
    if (input == 1){
        return 1;
    }
    else{
        if (input & 1){
            return 2 + get_cycle((3*input+1)>>1);
        }
        else{
            return 1 + get_cycle(input >> 1);
        }
    }
}

long get_range_cycle(int k, int j){
    int i;
    int max = 0;
    int current_cycle;
    int to = k > j ? k : j;
    int from = k < j ? k : j;
    for (i=from; i<=to; ++i){
        current_cycle = get_cycle(i);
        if (current_cycle > max){
            max = current_cycle;
        }
    }
    return max;
}

int main(){
    long p, q;
    long re[100][3];
    int i = 0;
    while (scanf("%ld %ld",&p,&q) == 2){
        re[i][0] = p;
        re[i][1] = q;
        re[i][2] = get_range_cycle(p,q);
        ++i;
    }
    int j;
    for (j=0; j<i; ++j){
        printf("%ld %ld %ld\n",re[j][0],re[j][1],re[j][2]);
    }
}

что не так с моим кодом?вход и выход точно такие же, как и в sample. Но результат отправки всегда является ошибкой во время выполнения!

Ответы [ 2 ]

1 голос
/ 29 августа 2011

Ваш код, кажется, предполагает максимум 100 строк во входном файле - пример данных, которые они проверяют, может быть больше?Они не делают явных заявлений относительно максимального установленного размера входных данных.

0 голосов
/ 29 августа 2011

Я полагаю, что проблема, на которую вы ищете ответ, находится в ответе @Elemental. Однако, если вы это исправите, срок действия вашего решения истечет.

Что вам нужно сделать, это составить список всех ответов от 0 до 1000000. Это можно сделать за линейное время (я не буду давать вам полный ответ).

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