对数组中的奇数和偶数整数求和

Sum the odd positioned and the even positioned integers in an array

本文关键字:整数 求和 数组      更新时间:2023-10-16

将'奇数位上的每个数'与'偶数位上的每个数乘以3'求和的最优雅的方法是什么?我必须遵守这个原型

int computeCheckSum(const int* d)

我的第一次尝试是使用这个,但我的想法是有缺陷的。我找不到一种方法来区分哪个元素是这样的

int sum=0;
for_each(d,
         d+11,
         [&sum](const int& i){sum+=(i%2==1)?3*i:i;}
);

例子

1 2 3 4 5

1 + 2 * 3 + 3 + 4 * 3 + 5 = 27

我找不到一种方法来区分哪个元素是这样的

如果您坚持使用for_each(这里没有理由这样做),那么您可以单独跟踪索引:

int computeCheckSum(const int* d, int count)
{
    int sum=0;
    int pos=1;
    std::for_each(d, d+count,
             [&sum,&pos](const int& value) { sum += pos++ % 2 ? value : value * 3; } );
    return sum;
}

注意,我添加了一个count参数,因此该函数可以处理任何长度的数组。如果你觉得很反常,你可以删除这个参数,然后重新硬编码长度,这样这个函数就只适用于有12个元素的数组。但如果你希望有一天能做得很好,那么这样做会让你觉得很恶心。

这些东西在c++中很少变得非常"优雅"(c++似乎在"行噪声"索引上逐渐接近Perl),但由于accumulate是左折叠,您可以"沿着折叠"传递索引:

int sum = std::accumulate(d, 
                          d + 11,
                          std::make_pair(0,0), // (index, result)
                          [](std::pair<int, int> r, int x) { 
                               r.second += r.first % 2 ? x : 3 * x; 
                               r.first++; 
                               return r; 
                          }).second;

你是对的。正如Mud所说,这只是一个糟糕的功能设计。这就是我需要的。

int computeCheckSum(){
    int sum = 0;
    bool multiplyBy3 = false;
    for (auto i : m_digits){
        sum += multiplyBy3 ? 3*i : i;
        multiplyBy3 = !multiplyBy3;
    }
    return sum;
}

Mud的解决方案是正确的使用我有缺陷的设计。正如大家所说,一个简单的for循环可能是更好的解决方案。