C ++中列表中所有元素的乘法和

时间:2013-05-06 05:36:11

标签: list stl

该程序假设返回列表中所有元素的乘法和。 如果list包含(1,2,3),则应返回6。 我看到了一些相关的帖子,但我仍然无法理解。

我试过了:

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.任何线索?

4 个答案:

答案 0 :(得分:2)

假设@Frank Osterfeld的评论在建议你想要列表中元素的产品时是正确的,这将是这样做的:

#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元素的值中加了一个,这也不是你想要的。

答案 1 :(得分: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;
}

答案 2 :(得分:0)

你的问题就在这一行:

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

您正在取消引用指针,然后添加一个指针,但您要做的是在指针中添加一个:

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

答案 3 :(得分:0)

这里建议的答案假设存储的输出位于整数范围内!!!,如果输出将超过2 ^ 64,那该怎么办!!!一种可能的解决方案是添加(列出添加而不是使用&#39; +&#39;运算符)可用的总和n次,其中n来自列表。