2016-10-26 4 views
-1

Ich mache eine Implementierung des 3n + 1-Algorithmus, aber aus irgendeinem Grund, wenn n = 2, ändert die Division n = n/2 nicht den Wert und schafft eine unendliche Schleife, und ich kann nicht sehen, warum:Division durch 2 und Endlosschleife in C

#include <stdio.h> 
#include <stdlib.h> 


int main(void) 
{ 
    int i=0,j=0,n=0,count,max; 

     scanf("%d",&i); 
     scanf("%d",&j); 

     max = 0; 

     for(n=i; n<=j; n++){ 
      count = 0; 

      while(n != 1){ 
       //Debug print 
       printf("%d - %d\n",count,n); 

       if(n%2 != 0){ //Odd 
        n = 3 * n + 1; 
       } else { //Even 

        n = n/2; 

        //n /= 2; 
        //n = n >> 1; 
       } 
       count++; 
      } 
      max = (count > max) ? count : max; 
     } 
     printf("%d %d %d\n",i,j,max); 

    exit(EXIT_SUCCESS); 
} 

[Solve] die for-Schleife und de while-Schleife den Wert von n Wechsel wurde

for(k=i; k<j;k++){ 
    count =0; 
    n = k; 
    while(n!= 1){ 
      . . . 
+1

Ich empfehle zu lernen, wie man einen Debugger verwendet, um durch den Code zu gehen und die Variablen zu untersuchen. – dandan78

+0

Es scheint, dass Sie die Collatz-Vermutung widerlegt haben .... –

Antwort

2

Es ist Ändern n und verlässt die while Schleife. Der Code, der danach ausgeführt wird, ist jedoch für die Endlosschleife verantwortlich. Wenn Sie einen Debugger nicht verwenden können, fügen Sie eine printf Anweisung direkt nach count = 0 hinzu, um zu sehen, was passiert. Oder, unter der Annahme, dass die while Schleife mit n = 1 beendet (was es tut), was passiert mit n, wenn Sie eine weitere Iteration der for-Schleife starten?

+0

Beachten Sie auch die Tatsache, dass die for-Schleife Variable nur verlassen, wenn n> = j, die 1000 sein könnte, auch wenn ich 2. – kabanus

+0

Zum Beispiel debugging mit i = 3 und j = 5 die Abfolge der Zählung, n sind 0 bis 3, 1 - 10, 2 bis 5, 3-16, 4 - 8, 5-4, 6 - 2, 0 bis 2, 0 - 2, 0 - 2, etc ... Aus irgendeinem Grund scheitern in dem Fall 2/2 –