2017-12-03 74 views
3

我最近發現了關於3n + 1的問題,並想寫一個簡單的代碼來解決這個問題。3n + 1給出負數

這一切都有效,但在高的奇數如999,999,999它去負數,並重復一個無休止的循環,我不知道爲什麼。

// if n is odd n = 3n+1 
// if n is even n = n/2 
while (true) 
{ 
    int n; 
    Console.WriteLine("Enter a positive whole number greater than one: "); 
    while (!Int32.TryParse(Console.ReadLine(), out n)) 
    { 
     Console.WriteLine("Enter a positive whole number greater than one: "); 
    } 
    while (n != 1) 
    { 
     if (n % 2 == 0) 
     { 
      n /= 2; 
      Console.WriteLine("n/2  = " + n); 
     } 
     else 
     { 
      n = 3 * n + 1; 
      Console.WriteLine("3 * n + 1 = " + n); 
     } 
    } 
    Console.ReadLine(); 
    Console.Clear(); 
} 

我在做什麼錯?謝謝!

+1

聽起來像之後你正在運行到[整數溢出](https://en.wikipedia.org/wiki/Integer_overflow) –

+1

[collat​​z conjeture](https://en.wikipedia.org/wiki/Collat​​z_conjecture)已被檢查所有小於87×2^60的數字(通過yoyo @ home項目) - 您需要的整數大於[66 (https://www.wolframalpha.com/input/?i=ln_2(87%C3%972%5E60))進行競爭。 int32和int64太小。使用[十進制](https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/decimal)([10^28〜> 2^93](https://www.wolframalpha .com/input /?i = ln_2(10%5E28)))或[BigInteger](https://msdn.microsoft.com/en-us/library/system.numerics.biginteger(v = vs.110)。 ASPX)。編輯:忽略運行時間。 – Theraot

回答

3

這是發生由於整數溢出

在計算機編程,當算術 操作試圖創建一個數字值,該值是可被表示的 範圍之外發生的整數溢出給定位數 - 大於最大值或小於最小可表示值的 。

您可以使用64位整數類型,以便具有更大的整數範圍。顯然,在後一種情況下,溢出也會被注意到,但是它會發生在很大數量的情況下。具有64位整數可以代表

18,446,744,073,709,551,615 numbers 

而用32位整數可以代表

4,294,967,295 numbers 

Int32殼體和Int64你應該除以二上面的數字,並採取商數,這將是可以表示的最大正數。這應該完成,因爲Int32Int64都是有符號整數。

更好的方法是利用UInt64,參見here,它可以用來表示值爲0到18,446,744,073,709,551,615的無符號整數。

定義在這種情況下也可以注意到溢出。

2

int最大爲2,147,483,6473nn999,999,999將是更大和溢出,這將導致n爲負n = 3 * n + 1;