2010-09-14 6 views
0

Я получаю неправильный ответ от обоих онлайн-судей.Что не так с моим решением 3n + 1?

#include <stdio.h> 

int main(int argc, char * argv[]) 
{ 
long long i=0; 
long long j=0; 
long long p=0; 
long long q=0; 
long long larger; 
long long smaller; 
long long cycle_length=1; 
long long max_cycle_length=1; 

while (scanf("%lld %lld",&p,&q) !=EOF) 
{ 
    /*check validity of input*/ 
    if (p <= 0 || p >= 1000000 || q <= 0 || q >= 1000000) continue; 
    max_cycle_length=1; 
    if (p > q) 
    { 
    larger = p; 
    smaller = q; 
    } 
    else 
    { 
    larger = q; 
    smaller = p; 
    } 
    for (i=smaller;i<=larger;i++) 
    { 
    cycle_length = 1; 
    /*printf("i = %lld\r\n",i);*/ 
    j = i; 
    while (j > 1) 
    { 
    /*printf("j = %lld\r\n",j);*/ 
    if ((j % 2) == 0) 
    { 
    j = j/2; 
    } 
    else 
    { 
    j = 3*j + 1; 
    } 
    cycle_length++; 
    } 
    if (cycle_length > max_cycle_length) 
    max_cycle_length = cycle_length; 
    /*printf("cycle_length = %lld\r\n", cycle_length);*/ 
    } 
    printf("%lld %lld %lld \r\n",p,q,max_cycle_length); 
} 
return 0; 
} 
+2

Кажется, хорошо для меня. Что он должен выводить? –

+2

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

+0

@ Daren: FWIW, гипотеза 3n + 1 или «гипотеза Collatz» - это то, о чем он говорит: http://en.wikipedia.org/wiki/Collatz_conjecture, и это «разумно» хорошо известно, но не совсем так хорошо, что это не должно быть конкретно указано, я согласен. –

ответ

3

ли вы подтвердить свой код, используя входной образец и пример вывода:

Sample Input 

1 10 
100 200 
201 210 
900 1000 

Sample Output 

1 10 20 
100 200 125 
201 210 89 
900 1000 174 

?

Только незначительные проблемы, которые я вижу, являются:

while (scanf("%lld %lld",&p,&q) !=EOF) 

, вероятно, следует:

while (scanf("%lld %lld", &p, &q) == 2) 

и:

printf("%lld %lld %lld \r\n",p,q,max_cycle_length); 

, вероятно, следует:

printf("%lld %lld %lld\n", p, q, max_cycle_length); 
+0

Возможно, это дополнительное пространство и/или возврат каретки, который получает отказ. – bstpierre

2

Принимают ли онлайн-судьи C99?

long long (и их printf преобразования спецификация) является C99 типа. Он не был определен стандартом C89.

0

stdout открыт в текстовом режиме библиотекой еще до начала main. Это означает, что библиотека отвечает за управление различиями в разрыве строк между вашей программой и операционной системой.

уронить \r (и лишние пробелы) из ваших printf() звонков

printf("%lld %lld %lld\n", p, q, max_cycle_length); 
+0

Спасибо всем, мне удалось изменить код, чтобы судья его принял. Я изменил длинный длинный длинный unsigned int, но я думаю, что проблема заключалась в том, что я печатал каждый раз, когда небольшое число было первым, независимо от его позиции на входе, когда я должен был печатать цифры в точном порядке ввода. –