数组中不同数字的总和

时间:2016-11-22 09:18:55

标签: c++ loops

我希望有一个函数可以返回数组中不同(非重复)值的总和:如果我有display = "none",我希望总和为([\w ]*)(?!display:|display = ")none([\w ]*) but it found all words "none"

我的尝试是:

{3, 3, 1, 5}

它返回3 + 1 + 5 = 9,我想我知道为什么,但我不知道如何改进它。我应该改变什么?

6 个答案:

答案 0 :(得分:2)

将所有项目放入一组中,然后计算它们。

集合是仅包含每个值的一个元素的数据结构(即,它们的每个元素都是唯一的;如果您尝试多次添加相同的值,则只计算一个实例)。

您可以查看this interesting question关于以最优雅的方式执行此操作的信息。

答案 1 :(得分:1)

首先,你的循环应该是for (int i=0; i<size;i++)。您的实际代码正在访问数组的边界。

然后,如果您不想使用STL容器和算法(但您应该),您可以按如下方式修改代码:

int sumdiff(int* t, int size){
    int sum=0;
    for (int i=0; i<size;i++){

        // check if the value was previously added

        bool should_sum = true;

        for(int j=0; should_sum && j<i;j++){
            if(t[i]==t[j])
                should_sum = false;
        }

        if(should_sum)
            sum=sum+t[i];
    }
    return sum;
}

int main()
{
    int t[4]={3, 3, 1, 5};
    cout << sumdiff(t, 4);
}

答案 2 :(得分:0)

你可以:

  • 首先将数组内容存储到std::unordered_set。通过这样做,你基本上可以自动摆脱重复。
  • 然后致电std::accumulate计算总和
  • 答案 3 :(得分:0)

    ** wasthishelpful的回答正是我所说的。在我发布我的帖子后,我看到了他的帖子。

    因此,您尝试使用内循环检查重复的数字。 但是,无论什么导致错误的结果,你的外部循环将循环4次。 尝试,

    • 只检查内循环。 (使用标记来记录是否为假)
    • 在内循环之外做你的总和。 (当flag为真时做总和)

    答案 4 :(得分:0)

    将数组元素插入集合并使用std::accumulate函数:

    #include <iostream>
    #include <numeric>
    #include <set>
    
    int main()
    {
        int t[4] = { 3, 3, 1, 5 };
        std::set<int> mySet(std::begin(t), std::end(t));
        int mySum = std::accumulate(mySet.begin(), mySet.end(), 0);
        std::cout << "The sum is: " << mySum << std::endl;
        return 0;
    }
    

    答案 5 :(得分:0)

    这是另一个使用std::accumulate的解决方案,但它会在调用std::accumulate时迭代原始元素,并构建集合并在遇到数组中的每个数字时保持运行总计:< / p>

    #include <iostream>
    #include <numeric>
    #include <set>
    
    int main()
    {
        int t[4] = { 3, 3, 1, 5 };
        std::set<int> mySet;
        int mySum = std::accumulate(std::begin(t), std::end(t), 0, 
             [&](int n, int n2){return n += mySet.insert(n2).second?n2:0;});
        std::cout << "The sum is: " << mySum << std::endl;
        return 0;
    }
    

    它的工作方式是std::insert()将返回pair tbat,确定是否插入了该项目。该对的secondbool,表示该项目是否已插入集合中。如果插入成功,我们只会添加总数,否则我们会添加0

    Live Example