這是一個有趣的問題,在幾個級別,但有一些問題需要指出。首先,由nhgrif發佈的算法是正確的(並且被接受爲這樣),但請記住對於給定的「產品」函數,「int」和「long」返回值溢出相當快,所以代碼從未實際上給出了k = 25的正確答案。實際上,對於int類型,所述算法僅給出正確答案,直到k = 7,即1838865600(在我的機器上)。之後,對於k> = 8,數值不正確。
這可以通過使用所顯示的PROD()函數的輸出運行nhgrif的算法來看到說多達K = 10:
i = 1: -5
i = 2: -60
i = 3: -1140
i = 4: -29640
i = 5: -978120
i = 6: -39124800
i = 7: -1838865600
i = 8: -2147483648
i = 9: -2147483648
i = 10: -2147483648
.
.
.
從上面看到的最大值(在量值上),用於INT在我迅速達到= 8,這可以通過運行進行檢查:
#include <iostream>
#include <limits>
int main(int argc, const char * argv[])
{
int maxInt = std::numeric_limits<int>::max();
std::cout << "max: " << maxInt << std::endl;
return 0;
}
賦予的預期值:
max: 2147483647
我們也看到,對於長數據類型,我們有同樣的問題,但可以使它達到k = 12,直到長的限制在k = 13時被觸及,即:-9223372036854775808。
底線是上面的發佈代碼給出了Matt最初請求的k = 25的值的錯誤答案。
解決方法是使用數字的字符串表示形式。這樣的字符串表示通常用於超出普通數據類型(例如,Rubik立方體狀態的#或一克碳中的原子的數量)限制的大數字。但我認爲這可能需要一點思考,因爲計算需要表示爲對字符串的操作,以避免直接處理整數和長整數。
有趣的是,由Matt給出的函數直接相加,以對任意k中的封閉形式解:
![enter image description here](https://i.stack.imgur.com/KsKEH.jpg)
在Gamma函數來表示,這將需要一些額外的代碼在C中定義++ (但C++ 11已定義)。
作爲參考,對於k = 25的答案馬特的PROD()函數是: -6472463290438308956636841782995191201792000000
爲了什麼它的價值,你也可以寫遞歸算法:
#include <iostream>
long prod(int k);
int main(int argc, const char * argv[])
{
int k = 10;
for (int i = 1; i <= k; i++) {
std::cout << "i = " << i << ": " << -prod(i) << std::endl;
}
return 0;
}
long prod(int k) {
if (k == 1) {
return 5;
}
else {
return (7*k - 2)*prod(k - 1);
}
}
但這代碼也有上面討論的相同的溢出問題。
使用'std :: accumulate'(我想'boost :: irange'對數字效果很好)。 – chris
我會看看,謝謝。 – Matt
@Matt,我只是在這裏添加了一些註釋,希望它有幫助。您可能需要檢查k = 25的數值。您使用的是什麼值?順便說一下,你的這個功能的應用是什麼?只是好奇。 –