2017-02-13 60 views
2

我在使用dotnetfiddle來解決一些練習題時,遇到了一些非常奇怪的事情。我有一個應用數學序列(不同的計算每一個步驟取決於當前步驟是偶數或奇數)的程序:C# - 相同的計算更慢使用Int vs Long?

using System; 

public class Program 
{ 

    public static void Main() 
    { 
     int ceiling = 1000000; 

     int maxMoves = 0; 
     int maxStart = 0; 
     int testNumber; 

     for(int i = 1; i <= ceiling; i++){ 
      testNumber = i; 
      int moves = 1; 
      while(testNumber != 1){ 
       if(testNumber % 2 == 0){ 
        testNumber = testNumber/2; 
        moves++; 
       } else { 
        testNumber = (3 * testNumber) + 1; 
        moves++; 
       } 
      } 
      if(moves > maxMoves){ 
       maxMoves = moves; 
       maxStart = i; 
      } 
     } 

     Console.WriteLine(maxStart); 
     Console.WriteLine(maxMoves); 
    } 

} 

書面,執行時間限制被突破。但是,如果我改變的測試號聲明的長而不是一個整數,程序運行:

int maxMoves = 0; 
int maxStart = 0; 
**long** testNumber; 

爲什麼會做出這種改變,這就需要從int重鑄ilong對的每個增量循環(在testNumber = i),比將此作爲int更快?在long值上執行數學運算更快嗎?

回答

7

原因似乎是溢出。如果您運行封閉在一個

checked 
{ 
    // your code 
} 

代碼你testNumberint運行時得到一個OverflowException

原因是最終3*testNumber+1超過了int的邊界。在unchecked的情況下,這不會引發異常,但會導致負值值爲testNumber

此時你的序列(我認爲這是Collatz吧?)不工作了,計算需要(可能infinitly)更長的時間,因爲你永遠也達不到1(或至少它需要你一大堆更多的迭代達到1)。

+0

非常感謝!是的,那是Collat​​z。 – sadq3377