2013-11-05 39 views
0

我想寫這個產品在一定範圍內

enter image description here

迴路帶點其中Pi是(如果你不知道,只是被徹底的)爭論的產品在範圍k。 Sorta就像求和符號一樣。無論如何,我似乎無法圍繞如何寫這個。我寫了這個小函數,但它不是我想要的。它只是在我指定的範圍內打印(7i - 2)的結果。它不是把它們全部放在一起,我知道我沒有要求它這樣做。我甚至不確定如何要求它這樣做。尋找提示,不一定是答案(但是,這也會很好)。

什麼我迄今所做的:

void prod(long int& num) 
{ 
    for (int i = 1; i <= 25; ++i) 
    { 
     num =(-1.0)*((7.0*i - 2)); 

     std::cout << num << std::endl; 

    } 
} 
+2

使用'std :: accumulate'(我想'boost :: irange'對數字效果很好)。 – chris

+0

我會看看,謝謝。 – Matt

+0

@Matt,我只是在這裏添加了一些註釋,希望它有幫助。您可能需要檢查k = 25的數值。您使用的是什麼值?順便說一下,你的這個功能的應用是什麼?只是好奇。 –

回答

2
num = 1;  
for (int i=1; i <= 25; ++i) 
{ 
    num *= ((7.0*i - 2)); 
    std::cout << -num << std::endl; 
} 
num *= -1; 
std::cout << num << std::endl; 

細微的差別。

*=操作是這樣的....

A *= B; 

是完全一樣寫這...

A = A * B; 

它左邊的值的相乘值對,並將其分配給左側的值。

你可以做同樣的事情,所有的數學運算符:+=-=*=/=%=


編輯:作爲一個說明,並作爲正確指出的bruce3141的答案,無論是intlong long數據類型將導致溢出你之前k = 25,所以因爲它的立場,而這種算法是正確的,由於溢出,它不會在計算機中給你正確的結果。使用浮點數據類型如double確實不是一個可接受的解決方案。您需要查看可以處理大於long long將存儲的整數的類。我不確定C++有什麼,但是您正在尋找相當於JavaBigInteger類的東西。在端

num = num*((7.0*i - 2));

乘以它由-1

+0

完美的作品。謝謝。你能否偶然地將C++文檔中的'* ='鏈接到我?再次感謝。 – Matt

+0

該死的。我希望能有一些與Python文檔相媲美的東西(我是C++的新手)。再次感謝! – Matt

+2

[C++操作符摘要](http://en.cppreference.com/w/cpp/language/expressions#Operators),以及更多關於[賦值操作符族](http://en.cppreference.com/ W/CPP /語言/ operator_assignment)。那個站點,btw,是* C++語言查詢的站點。爲它加書籤。 – WhozCraig

1

初始化num爲1,然後把這個在while

std::cout<<prod(25); 

工作原理:

-1
double prod(unsigned int k) 
{ 
    double result = 1; 
    for(int i = 1; i <= k; i ++) 
    { 
     result * = 7*i - 2; 
    } 
    return -result; 
} 

,你可以用它

for(int i = 1; i <= k; i ++) 
    { 
     result * = 7*i - 2; 
    } 

計算表達式 的PI一部分,因爲-1是出了圓周率表達我的相乘-1的結果只返回一次,然後在返回語句中返回它:

return -result; 

編輯:

每個數學表達式(其中沒有未知數)將始終等於一個單一的值。所以最好通過使函數返回表達式的值來表示該表達式。返回一個值使得該函數可以重複使用,而不僅僅是將值輸出到控制檯。例如
。我可以做類似double x = prod(3) + prod(4);

由於有一個未知的(上限k),我把它作爲函數的一個參數,以便代碼可以用於不同的上限值k。

遵循良好的設計模式總是好的,以避免以後重新分解代碼而浪費時間。

+0

這在幾個層面上是錯誤的...原始問題是使用'void'函數,並且只使用'int'數據類型...現在突然之間,您已經將它變成了一個返回「double」的函數,並且發送的參數與原始問題完全不同...... – nhgrif

+0

@nhgrif我已經在地址上回答了OP的問題,而不僅僅是他的代碼,我會發佈一個更新與解釋更改 – gldraphael

+0

您的答案仍然存在問題。例如,你從返回一個'double'的函數返回一個'int' ... OP想要的(或者至少想到他想要的)返回'void'的相同函數... – nhgrif

3

這是一個有趣的問題,在幾個級別,但有一些問題需要指出。首先,由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

在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); 
    } 
} 

但這代碼也有上面討論的相同的溢出問題。

+0

這是很多東西。我的'我'最大是任意設置的,不一定是我的問題需要。但這是很好的知道。我的實際任務在求和函數中有這個(有趣的是)。我應該證明/反駁整個表達式等同於另一個函數,用於爲一個單獨的變量'n'的任意大的值。這完全是另一個問題......又是......很多工作。 – Matt

+0

@Matt就像注意的那樣,雖然'k = 25'會導致'int'和'long long'的溢出,但是使用'double'數據類型(這裏沒有提到)是絕對錯誤的。 'Java'提供'BigInteger'類,其他編程語言也有類似的選擇,但我不確定'C++'有什麼。如果語言中沒有任何內容,幾乎肯定會有一個圖書館可供下載,其中某人已經優化了一個類,用於存儲大於「long long」所能容納的整數。 – nhgrif