2010-09-14 4 views
0

Je me trompe de réponse des deux juges en ligne.Quel est le problème avec ma solution 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

semble correct pour moi. Qu'est-ce qu'il est censé produire? –

+2

cette question a besoin de plus de contexte - je parie que je ne suis pas le seul qui n'a pas la moindre idée de ce dont vous parlez. –

+0

@Daren: FWIW, La Conjecture 3n + 1, ou la "Conjecture Collatz", est ce dont il parle: http://en.wikipedia.org/wiki/Collatz_conjecture et c'est "raisonnablement" bien connu, mais pas tout à fait bien qu'il ne devrait pas être expressément indiqué, je suis d'accord. –

Répondre

3

Avez-vous vérifié votre code en utilisant la sortie d'entrée de l'échantillon et de l'échantillon:

Sample Input 

1 10 
100 200 
201 210 
900 1000 

Sample Output 

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

?

Les seuls petits problèmes que je vois sont:

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

devrait probablement:

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

et:

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

devrait probablement:

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

C'est probablement l'espace supplémentaire et/ou le retour de chariot qui reçoit un rejet. – bstpierre

2

Est-ce que les juges en ligne acceptent C99?

long long (et leur spécification de conversion printf) est un type C99. Il n'a pas été défini par la norme C89.

0

stdout est ouvert en mode texte par la bibliothèque avant même que main ne commence. Cela signifie que la bibliothèque est responsable de la gestion des différences de sauts de ligne entre votre programme et le système d'exploitation.

Laissez tomber les \r (et des espaces supplémentaires) de vos appels printf()

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

Merci pour tout le monde, j'ai réussi à changer le code de sorte que le juge l'a accepté. J'ai changé le long long non signé int, mais je pense que le problème était que j'ai imprimé chaque fois le petit nombre d'abord, indépendamment de sa position dans l'entrée, quand j'aurais dû imprimer les numéros dans l'ordre exact de l'entrée. –

Questions connexes