2013-05-06 69 views
0

程序假設返回列表中所有元素相乘的總和。 如果列表包含(1,2,3),它應該返回6. 我看到一些相關的帖子,但我仍然無法弄清楚。C++中列表中所有元素相乘的總和

我嘗試這樣做:

的的Xlist cotains(3,2)

for (std::list<unsigned>::iterator it=xList.begin(); it!=xList.end(); ++it) 
{ 
subtotal= ((*it) * ((*it+1)); 

total= total + subtotal; 
} 

輸出我得到的是18,我應該得到6.任何線索?

+0

我不明白你的算法如何描述你所描述的。你的意思是總數* = *它? (總共初始化爲1) – 2013-05-06 05:49:50

+0

是總計初始化 – lily 2013-05-06 06:08:09

回答

2

假設@Frank奧斯特費爾德的評論是正確的暗示你想要的在列表中元素的產品,這將做到這一點:

#include <iostream> 
#include <list> 

int main() { 
    std::list<unsigned> xList; 
    xList.push_back(3); 
    xList.push_back(2); 

    unsigned product = 1; 

    for (std::list<unsigned>::iterator it=xList.begin(); it!=xList.end(); ++it) { 
     product = product * (*it); 
    } 

    std::cout << product << std::endl; 
    return 0; 
} 

由於it是一個迭代器,而不是一個指針,你無法通過添加一個得到它的迭代器的下一個值。正如其他人所表明的那樣,原始代碼會將一個元素添加到list元素的值中,這不是我們想要的。

+0

這解決了問題:) – lily 2013-05-06 06:09:39

1
for (std::list<unsigned>::iterator it=xList.begin(); it!=xList.end(); ++it) 
{ 
    subtotal= ((*it) * (*(it+1)); 

    total= total + subtotal; 
} 

你想要這樣嗎?雖然我不太讓你通過

「乘法之和」的意思,這可能有對列表中的最後一個元素的另一個問題,*(it+1)會出界

如果你想要的乘法列表中的所有元素,

unsigned total = 1; 
for (std::list<unsigned>::iterator it=xList.begin(); it!=xList.end(); ++it) 
{ 
    total *= *it; 
} 
+0

解決了它,謝謝@afriza :) – lily 2013-05-06 06:03:19

0

你的問題是這樣的一行:

subtotal= ((*it) * ((*it+1));

您解引用指針並然後添加一個到它,但你想要做的就是添加一個指針:

subtotal= ((*it) * (*(it+1));

0

在這裏建議的答案假設輸出存儲位於整數範圍內!,如果輸出將跨越2^64 !!!。一個可能的解決方案是添加(列表添加並且不使用'+'運算符)可用總和n次,其中n取自列表。

+0

包括實際的代碼示例可以使這個答案更好 – arghtype 2014-07-26 12:07:48