2010-12-14 4 views
0

Je viens de commencer avec Programming Challenges et essaye de résoudre 3n+1 problem. Mon programme donne RUNTIME ERROR dans le juge UVA et WRONG REPONSE dans la programmation défis juge. Mais je ne trouve aucune erreur dans le programme .. Tous les cas de test donnent des réponses correctes pour moi. Quelqu'un peut-il me dire ce qui pourrait être fauxMa solution 3n + 1 en Java a jugé une erreur incorrecte/d'exécution, pourquoi?

1: import java.io.*; 
    2: import java.util.*; 
    3: class Main{ 
    4:  public static void main(String args[]) throws IOException{ 
    5:   BufferedReader br=new BufferedReader(new 
InputStreamReader(System.in)); 
    6:   String s,ar[]; 
    7:   long aray[]=new long[50]; 
    8:   int n=0,maxcount=0,count; 
    9:   long t,a,b,c=1,co=0; 
    10:  while((s=br.readLine()).length()>0) { 
    11:    ar=s.split(" "); 
    12:    aray[n++]=Long.parseLong(ar[0]); 
    13:    aray[n++]=Long.parseLong(ar[1]); 
    14:   } 
    15:   
    16:   for(int j=0;j<n;) { 
    17:    c=1; 
    18:    maxcount=0; 
    19:    a=aray[j++]; 
    20:    b=aray[j++]; 
    21:    co=b-a+1; 
    22:    if(a>b){    //special case 
    23:     c=-1; 
    24:     co=a-b+1; 
    25:    } 
    26:    for(long i=a,k=0;k<co;i+=c,k++){ 
    27:     t=i; 
    28:     count=1; 
    29:     while(t!=1){ 
    30:      if(t%2==0) t=t/2; 
    31:      else t=(3*t)+1; 
    32:      count++; 
    33:     } 
    34:    maxcount=(maxcount>count)?maxcount:count; 
    35:   } 
    36:   System.out.println(a+" "+b+" "+maxcount); 
    36:   System.exit(0); 
    38:  } 
    39: } 
+2

Un pointeur sur l'affectation serait cool. Et le formatage du code (indentation). Et en utilisant des noms lisibles pour les noms de variables. –

+1

BTW - vous n'êtes pas seul: [voici une autre question sur cette tâche] (http://stackoverflow.com/questions/1997215/why-is-my-3n1-problem-solution-wrong). –

+0

En dehors de tests unitaires significatifs, je suggère que vous utilisiez également des méthodes pour diviser votre code et les noms de variables significatifs. Il y a tellement d'endroits où votre code pourrait exploser, savez-vous quelle était l'exception d'exécution? –

Répondre

0

Vous avez quelques problèmes de lisibilité avec votre code. Je ne peux même pas voir les erreurs dans votre algorithme en raison de son manque de lisibilité. Structurellement, comme d'autres l'ont mentionné, il n'est pas bien divisé. Vous devriez au moins avoir une fonction getRanges() pour accepter toutes les entrées utilisateur et une méthode getMaxCycleLen (i, j) pour calculer la longueur du cycle pour un cycle particulier. Du point de vue du style, comme d'autres l'ont mentionné, les noms de vos variables ne sont pas descriptifs. Les noms de variables ne devraient presque jamais comporter 1 ou 2 caractères (i, j, k excepté, bien sûr). Ils doivent être à la fois descriptifs de l'utilisation de la variable (compteur, index, maxCycles, etc.) et suffisamment longs pour être recherchés dans le code (combien de fois voyez-vous "a" ou "ar" au milieu de un autre mot-clé/commentaire/variable?). Votre variable aray serait plus lisible si elle était un tableau de tableaux (aray [50] [2]). La façon dont vous l'écrivez, c'est très difficile de suivre ce qui se passe.

La ligne 7 déclare aray avoir une longueur de 50 entrées. Cela signifie que votre code échouera lorsque plus de 50 entrées seront fournies. (ceci peut être votre bogue d'exécution)

ligne 26: Cette boucle est bizarre. vous i + = c dans une tentative apparente de gérer des opérandes en désordre. Vos contraintes de boucle seront beaucoup plus lisibles si vous venez d'inverser a et que (tmp = a; a = b; b = a;)

ligne 36: vous n'avez pas besoin d'appeler system.exit(). Cela arrive pour vous, automatiquement, lorsque les sorties principales.

Une fois que vous faites votre code lisible, peut-être quelqu'un pourra pointer vers le bug (s)

Questions connexes