1

我正在对循环进行练习并且有疑问。

我有一个数组,ints并且想要遍历这个数组以获取sum数组元素。必须完成此迭代,在每次传递中,将第一个元素和最后一个元素相加,在第二次迭代中,将第二个元素和最后一个元素相加减去 1,依此类推。

如果我有一个包含偶数个元素的数组,我会这样做:

int main(){
    int i,sum=0,arraySize=10;
    int array[] = {1,2,3,4,4,4,7,8,9,10};

    for (i=0;i <arraySize/2;i++){
        sum+=array[i] + array[arraySize-i-1];
    }

    printf("The sum is %d\n", sum);

    return 0;
}

但如果我有一个奇数,我会这样做:

int main(){
    int i,sum=0,arraySize=11;
    int array[] = {1,2,3,4,4,4,7,8,9,10,11};

    for (i=0;i <(arraySize/2)+0.5;i++){
        if (i != (arraySize/2)){
            sum+=array[i] + array[arraySize-i-1];
        }
        else{
             sum+=array[i];
        }
    }

    printf("The sum is %d\n", sum);

    return 0;
}

这是正确的方法吗?

4

5 回答 5

3

我会这样做:

 for(i=0, j= arraySize-1; i <= j; i++,j--){
   sum += array[i];
   if(i!=j){ sum+= array[j]; }
 }
于 2012-05-09T10:05:05.877 回答
2

我会这样做 - 避免浮动,除非你真的需要它们:

for (i=0; i < (arraySize / 2) + (arraySize & 1); i++) {

(arraySize & 1)奇数为 1,偶数为 0。

或者更简单:

for (i = 0; i < (arraySize + 1) / 2; i++) {
于 2012-05-09T10:02:27.840 回答
1

这是一个针对可读性以及最少的分支/比较进行了优化的版本:

#include <stdio.h>
#include <stdio.h>

int calc_sum_in_weird_manner (const int* array, size_t n)
{
  int sum=0;
  const int* begin = &array[0];
  const int* end   = &array[n-1];

  while(begin < end)
  {
    sum += *begin + *end;
    begin++;
    end--;
  }

  if(begin == end) /* odd number */
  {
    sum += *begin;
  }

  return sum;
}


int main()
{
  const int array[] = {1,2,3,4,4,4,7,8,9,10,11};
  int sum;

  sum = calc_sum_in_weird_manner (array,
                                  sizeof(array)/sizeof(int));

  printf("The sum is %d.\n", sum);

  return 0;
}
于 2012-05-09T13:33:27.117 回答
0
krithika.595> cat file1.cc
#include<iostream>

using namespace std;

int main()
{     
int i,sum=0,arraySize=10;     
int array[] = {1,2,3,4,4,4,7,8,9,10};
int j;
for (i=0,j=(arraySize-1);i<=j;i++,j--)
{         
if(i==j)
sum+=array[i];
else
sum+=array[i] + array[j];     
}
cout <<sum<<endl;
}
krithika.596> ./a.out
52
krithika.597> 
于 2012-05-09T10:20:10.927 回答
0
for (i=0;(i <arraySize/2)||(array[i]==array[arraySize-i-1]);i++){
        if (array[i]==array[arraySize-i-1]) {
             sum+=array[i];

        }else{

        sum+=array[i] + array[arraySize-i-1];
        }
    }


    printf("The sum is %d\n", sum);
于 2012-05-09T10:44:43.947 回答