我有一个已排序但在
之间包含零的数组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++;
}
这个的任何替代?
答案 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;
或者代替基于循环的范围,您可以使用普通循环。