3n+1 неправильный ответ в соответствии с uva onlinejudge

Я пытаюсь решить вопрос "3n+1" и отправить его на uva onlinejudge, но каждый раз, когда он говорит, что мой код дает неправильный ответ, и, к сожалению, я не могу найти его проблему, вот вопрос: Проблема 100

Мой код:

        #include <stdio.h>
        int main()
        {
            unsigned long int n, m;
            int max = 0;
            scanf("%d %d", &n, &m);

            int i;
            for (i = n; i <m + 1; i++)
            {
                int ter = i;
                int counter = 1;
                while (ter != 1)
                {
                    counter++;

                    if (ter % 2 == 1) { ter = 3 * ter + 1; }

                    else
                        ter = ter / 2;

                    if (ter == 1)
                        if (counter>max) { max = counter; }
                }
            }

            printf("%d %d %d\n", n, m, max);

            return 0;
        }

4 ответа

Проблема понятна. Вы не следуете инструкциям из постановки проблемы

Для любых двух чисел i и j вы должны определить максимальную длину цикла по всем числам между i и j.

Входные данные будут состоять из серии пар целых чисел i и j, по одной паре целых чисел на строку. Все целые числа будут меньше 1 000 000 и больше 0.

  1. Вы читаете только одну строку ввода и печатаете этот ответ
  2. Вы предполагаете, что i меньше чем j

Следующая функция выполняет запрошенный расчет:

void n3plus1(int min, int max)
{
    int i, n, len, lenmax=0;

    for (i=min; i<=max; i++)
    {
        n= i; len= 1;
        while (n!=1) {
            if (n&1)
                 n= 3*n + 1;
            else n= n/2;
            len++;
        }
        if (len>lenmax) lenmax= len;
    }
    printf("Answer: %d %d %d\n", min,max,lenmax);
}

Со следующими тестами:

void test(void)
{
    n3plus1(22, 22);
    n3plus1(1, 10);
    n3plus1(100, 200);
    n3plus1(201, 210);
    n3plus1(900, 1000);
}

выход:

Answer: 22 22 16
Answer: 1 10 20
Answer: 100 200 125
Answer: 201 210 89
Answer: 900 1000 174

Примечание: "максимальная длина цикла для всех чисел от i до j" в постановке задачи должна интерпретироваться как включающая i а также j,

Код предполагает i<=j на входе. Код исключает чтение ввода.

Правильное решение:

#include <stdio.h>

int cycleSize(int x) {
int cycle = 1;

while (x != 1) {
    if (x % 2 == 0) { //if even
        x = x / 2;
    } else { //if odd
        x = x * 3 + 1;
    }
    ++cycle;
}
return cycle;
}

int maxCycleSizeBetween(int a, int b) {
if (a > b) { //if b > a, swap them
    int temp = a;
    a = b;
    b = temp;
}
int maxCycle = 0;

for (; a <= b; a++) {
    int thisCycleSize = cycleSize(a);
    if (thisCycleSize > maxCycle) {
        maxCycle = thisCycleSize;
    }
}
return maxCycle;
}

int main() {
int a, b; //input vars

while (scanf("%d %d", &a, &b) != EOF) {
    printf("%d %d %d\n", a, b, maxCycleSizeBetween(a, b));
}
return 0;
}

Следующий код реализует требования

Тем не менее, некоторые онлайн-конкурсы кода ожидают окончательной пустой строки. Вам нужно будет определить такие детали.

#include <stdio.h>

int main( void )
{
    size_t n1;
    size_t m1;
    char buffer[1024];

    while( fgets( buffer, sizeof(buffer), stdin ) )
    {
        if( 2 != sscanf(buffer, "%lu %lu", &n1, &m1) )
        {
            break;
        }

        size_t n = n1;
        size_t m = m1;

        if( n1 > m1 )
        { // then first number greater than second so reverse for calculations
            size_t temp = n;
            n = m;
            m = temp;
        }

        size_t maxCount = 0;
        for (size_t i = n; i <= m; i++)
        {
            size_t ter = i;
            size_t counter = 1;

            while (ter != 1)
            {
                counter++;

                if ( (ter & 0x01) == 1) 
                {  // then odd
                    ter = 3 * ter + 1; 
                }

                else
                { // else even
                    ter = ter / 2;
                }

                // for testing only
                // printf( "%lu: %lu, %lu\n", counter, i, ter );
            }

            if( maxCount < counter )
            {
                maxCount = counter;
            }
        }

        printf("%lu %lu %lu\n", n1, m1, maxCount);
    }
}

Замечания:

  1. этот код завершится, если введено не числовое значение
  2. этот код завершится, если EOF встретился - это ожидается
  3. однако этот код не будет выполнен, если введено отрицательное число; В соответствии с условиями конкурса, числа должны быть в диапазоне 1...1000000, поэтому не нужно проверять наличие отрицательных чисел.
  4. этот код будет выходить, если только одна цифра в строке ввода
  5. этот код выйдет, если только <cr> введен
Другие вопросы по тегам