2016-11-12 7 views
0

現在、私はCollat​​zの推測に関する問題に取り組んでいます。 問題のイメージを添付します。用語の量が最も多いCollat​​zシーケンスの検索

Question (from ProjectEuler)

今の問題は、明らかに1と1,000,000の間で述べています。しかし、私は、ユーザが開始点と終了点のどこにあるかを選択できるようにすることで、少しの機能性を追加しました。私は問題に遭遇しましたが。 (先のプログラミング経験のない初年度のCS学生として、私の知識は現時点では非常に限られています)。

最も高いシーケンスまたは最も高い 'loopCount'を持つものを見つける方法に関する私の考えは、対応するループカウントを持つ数値を配列にプッシュし、その配列の最大ループカウント値を見つけることです。しかし、限り、私は懸念している、それは2次元配列を含むだろう。

私が言ったように、私のプログラミングスキルには限界があります(私たちはまだアレイをカバーしていません)ので、これを始めるにはどうすればいいのか分かりません。

は、ここで私がこれまで持っているものです。

System.out.println("Enter starting point:"); 
    Scanner userStartingPoint = new Scanner(System.in); 
    long startingPoint = userStartingPoint.nextInt(); 

    System.out.println("Enter ending point:"); 
    Scanner userEndingPoint = new Scanner(System.in); 
    long endingPoint = userEndingPoint.nextInt(); 

    long timeBefore = System.currentTimeMillis(); 
    int loopCount; 

    for(long i = startingPoint; i <= endingPoint; i++) { 

     long number = i; 
     loopCount = 1; 

     while(number != 1) { 
      if(number%2 == 0) { 
       number = number/2; 
      } else if(number%2 != 0) { 
       number = (3*number)+1; 
      } 
      loopCount++; 
     } 

     System.out.println("Number: " + i + ". " + "Loop count: " + loopCount + "."); 
    } 

    long timeAfter = System.currentTimeMillis(); 
    long timeTaken = timeAfter - timeBefore; 
    System.out.println(endingPoint - startingPoint + " sequences."); 
    System.out.println("Time taken: " + timeTaken/1000 + " seconds."); 

私はいくつかの数字は量より上に行くの反復を持っていることを見つけたので、私はここに多くの変数のデータ型として「長い」を使用します'int'データ型で処理できます。

答えて

0

最高のloopCountを余分な変数に保存し、増加した場合は各反復後に更新するだけです。

int maxCount = 0; 
int loopCount; 

for(long i = startingPoint; i <= endingPoint; i++) { 

    long number = i; 
    loopCount = 1; 

    while(number != 1) { 
     if(number%2 == 0) { 
      number = number/2; 
     } else if(number%2 != 0) { 
      number = (3*number)+1; 
     } 
     loopCount++; 
    } 
    if(loopCount > maxCount){ 
     maxCount = loopCount; 
    } 
    System.out.println("Number: " + i + ". " + "Loop count: " + loopCount + "."); 
} 
System.out.println("Highest loopCount : " + maxCount); 
+0

どのように恥ずかしい!それは間違いなくそれについてもっと簡単な方法です。ありがとうございました – E13

関連する問題