2011-04-21 51 views
1

我之前問過這個問題,但是沒有理解這個問題的人關閉了它。我不是在尋找一個循環,我正在尋找如何爲生產代碼做這樣的事情,比如處理參數和溢出的錯誤。如何通過適當的錯誤處理在C++中實現階乘函數?

請不要只說「使用庫X」,除非您可以鏈接到上述庫的代碼,它實際上解決了這些問題。

+2

所以你的問題與階乘無關,而是關於「正確編程」? – 2011-04-22 00:01:01

+0

非常好。我不會說它不完全與階乘沒有任何關係,因爲我認爲你不會想要重量級的錯誤處理,比如簡單的問題。 – 2011-04-22 16:20:46

回答

3

可能是簡單的東西如:

unsigned factorial(unsigned n) 
{ 
    if (n > theUpperThreshold) 
     throw ExceptionFormYourMathLibrary("Explain that n! can't be represented by unsigned"); 

    return lookupTable[n];  
} 

除非你的數學庫提供了一些大的整數類爲好。

6

它取決於輸入的域。

如果您使用的是32位或64位整數,則根本不應該使用循環:只需使用查找表即可。沒有很多n,其中n!可以用64位整數表示。使用查找表,檢查溢出很容易:如果在查找表中沒有n的條目,則顯然超出範圍。

如果輸入大於那個值,那麼大概你會使用某種「大整數」類,溢出不太可能成爲問題。

+0

你是不是故意說「如果你的**輸出**是一個32位或64位整數?」 – 2011-04-21 23:57:15

+0

@Ken:是的,其實這就是我的意思。謝謝。 – 2011-04-21 23:58:11

+1

@霍華德:我知道這很小, 6點以後!我的大腦拋出一個溢出異常,所以我停在那裏。 – 2011-04-22 00:03:10

9

使用表格查找。你不需要大表,因爲階乘會很快溢出64位雙精度變量範圍。您只需要存儲參數值從0到170的函數值。超出該範圍的任何值都會產生錯誤。

+0

要添加到此,您還可以使用模板來生成列表。 – alternative 2011-04-22 00:04:43

+0

你怎麼產生這個錯誤?例外?返回-1?一個斷言?我是否應該使用out參數並返回0來獲得成功?這裏有很多選擇。 – 2011-04-22 16:19:51

+0

不要使用out參數來實現這樣一個簡單的功能。返回-1或拋出異常。 – pic11 2011-04-22 21:40:37