2013-05-06 105 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

相关问题