数组中的替代最高计数

时间:2014-03-15 13:46:23

标签: c++ arrays

我有一个已排序但在

之间包含零的数组
a[10]={0,0,3,5,0,6,7,0,9,0}

我想忽略零并找到替代元素的总和,即 分别为3 + 6 + 9和5 + 7。 这是我想做的事情

while(i<10)
{
     if(a[i]!=0)
     {
         s1=s1+a[i];
         i++;
     }
     if(a[i]!=0)
     {
         s2=s2+a[i]
         i++;
     }
     i++;
}

这个的任何替代?

3 个答案:

答案 0 :(得分:2)

使用布尔值来跟踪要将元素添加到的总和:

bool alt = true;
int sum1 = 0;
int sum2 = 0;
for(int i = 0; i<10; ++i)
{
    if(a[i])
    {
        if(alt)
        {
            sum1 += a[i];
        }
        else
        {
            sum2 += a[i];
        }
        alt = !alt;
    }
}

答案 1 :(得分:2)

如果可以修改数组, 以下是你说的(忽略零,然后计算替代总和):

int a[] = {0,0,3,5,0,6,7,0,9,0};
const auto end = std::stable_partition (std::begin(a), std::end(a),
                                        [](int e) {return e != 0;});

int sum1 = 0;
for (int i = 0; a + i < end; i += 2) { sum1 += a[i]; }
int sum2 = 0;
for (int i = 1; a + i < end; i += 2) { sum2 += a[i]; }

std::cout << sum1 << std::endl;
std::cout << sum2 << std::endl;

注意:如果你不能使用lambda(C ++ 11), 你必须编写谓词NotZero

答案 2 :(得分:2)

如果我正确理解了您的需求,这是一个非常简单的解决方案。

int sum[2] = {};

int j = 0;

for ( int x : a )
{
   if ( x ) sum[j++ % 2] += x;
}      

这是一个恶魔计划

#include <iostream>

int main()
{
    int a[] = { 0, 0, 3, 5, 0, 6, 7, 0, 9, 0 };

    int sum[2] = {};

    int j = 0;

    for ( int x : a )
    {
        if ( x ) sum[j++ % 2] += x;
    } 

    for ( int s : sum ) std::cout << s << std::endl;
}

输出

18
12

如果您使用的是MS VC ++ 2010,则可以将程序中的循环替换为以下

for each ( int x in a )
for each ( int s in sum ) std::cout << s << std::endl;

或者代替基于循环的范围,您可以使用普通循环。