0

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

我试过这个:

xList 包含 (3,2)

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

total= total + subtotal;
}

我得到的输出是 18,我应该得到 6。有什么线索吗?

4

4 回答 4

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

由于itis 是一个迭代器而不是一个指针,因此您无法通过向它添加一个来获得迭代器的下一个值。正如其他人所展示的,原始代码将列表元素的值加一,这也不是我们想要的。

于 2013-05-06T06:01:19.100 回答
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;
}
于 2013-05-06T05:40:21.520 回答
0

你的问题是这一行:

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

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

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

于 2013-05-06T05:42:25.953 回答
0

这里建议的答案假设存储的输出在整数范围内!!!,如果输出将跨越 2^64 怎么办 !!!。一种可能的解决方案是添加(列表添加而不使用“+”运算符)可用总和 n 次,其中 n 取自列表。

于 2014-07-26T12:03:47.017 回答