2013-06-12 87 views
7

我正在服用費馬最後定理的this定義。費馬最後定理算法

我想編寫一個算法來驗證它的較小值:

#include <iostream> 
#include <cmath> 
using namespace std; 

int main() 
{ 
    //a^n + b^n = c^n 

    int a, b, c, n, count = 0; 

    for (n = 3; n < 1000; n++) 
     for (a = 1; a < 1000; a++) 
      for (b = 1; b < 100; b++) 
       for (c = 1; c < 1000; c++) 
       { 
        if (a != b && b != c && a != c) 
        { 
         if (pow(a,n) + pow(b,n) == pow(c,n)) 
         { 
          cout << "\na: " << a << " b: " << b << " c: " << c << " n: " << n; 
          count++; 
         } 
        } 
       } 

    cout << count << " combinazioni"; 

} 

而且這是一塊輸出的畫面: Image

這怎麼可能呢?我是否錯過了C++編程中的「大整數」,可能會得到錯誤的結果?

+0

你知道在http://math.stackexchange.com數學論壇的? –

+2

我認爲你想收集經驗證據直到ℤ中的某些n,而不是證明。 @MarcAudet我認爲如果我們拋棄整個證明業務,這仍然是一個溢出問題。 –

+1

@MarcAudet任何包含代碼的問題通常都是[math.se]的主題。 – Dukeling

回答

12

你的pow()函數溢出;記住一個int有一個有限的大小。

例如,即使使用無符號數據類型,pow(256,4)也會在64位上溢出32位,pow(256,8)。

技術上int溢出不確定的行爲所以,什麼可能發生,包括迴繞(即回0),或鼻惡魔

unsigned int計算模2按照標準提高到WIDTH的功率;即將總是環繞。

+3

他可能在這裏調用[std :: pow](http://en.cppreference.com/w/cpp/numeric/math/pow),它使用浮點數。這仍然導致溢出,但溢出的性質更加複雜。 – ComicSansMS

+0

好點。雖然我有一個pow()重載兩個整數。 – Bathsheba

+3

對於* signed *整數是不是隻有UB? – harold

2

int值被限制爲32位(包括符號位),因此高值「wrap」超過2147483647. C/C++沒有任何內置數據類型的任意大的值。

要在某種程度上減少此問題,可以使用longunsigned long(64位平臺上的64位)類型。如果您使用的是long long,某些編譯器也支持32位平臺上的64位。

編輯:正如下面的評論所指出的那樣,這些限制並不適用於C/C++的所有實現,但是對於大多數今天你會看到的非嵌入式系統,這些都是你要去的限制查看。

+1

-1整數類型的實際大小是在C++中定義的實現。特別是,'int'並不總是32位大小,'long'並不總是大於'int'(儘管對於在Op的屏幕截圖中顯示的IDE都是如此)。 – ComicSansMS

+0

正確。我可以更普遍地解釋它,但在這個特定問題的背景下沒有任何區別。沒有我知道的實現可以將'pow(927,104)'放入'int'中。謝謝澄清,但。 –

7

我思念的東西

是你。其實很多。讓我列舉一下。

  1. 類型。並非C++中的所有數字都是整數。特別是,pow的結果不是整數。
  2. 精密度。那些不是整數的類型在C++中的精度有限。在數學中,1和1.00000000000000000000000000000000000000000000982是不同的數字。在你的C++程序中,祝你好運。
  3. 限制。 C++中的整數和非整數在它們可以假設的值範圍內都是有限的。一個int類型的變量可以保證包含在-32767到32767之間的數字。實際上許多實現支持的不止於此,例如-2147483648至2147483647.許多實現具有可以容納更大範圍的數字的其他類型,例如,0到18446744073709551616或有時到340282366920938463463374607431768211456甚至到115792089237316195423570985008687907853269984665640564039457584007913129639936.(如果你可以在你的腦海中取對數爲100位數字,你會注意到所有這些限制都是2的冪或者接近該值的東西)。爲了便於比較,927的104的動力376957467458457979751155893254582133603833255821602148851832991547421266649046326838345134050350882042675908426098865621401193999321757163912667101283653576225503152314408933435079267041822928198211089834145222519701307017745008621307049171220994632585789166175212394809510781938945415209193278956111609706241.
+1

+1爲了完整。我會盡力記住這個價值:) –