我正在做一个循环练习并且有疑问。
我有一个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;
}
这是正确的方法吗?
答案 0 :(得分:3)
我会这样做:
for(i=0, j= arraySize-1; i <= j; i++,j--){
sum += array[i];
if(i!=j){ sum+= array[j]; }
}
答案 1 :(得分:2)
我会这样做 - 除非你真的需要它们,否则请避免浮动:
for (i=0; i < (arraySize / 2) + (arraySize & 1); i++) {
(arraySize & 1)
对于奇数为1,对于偶数值为0。
甚至更容易:
for (i = 0; i < (arraySize + 1) / 2; i++) {
答案 2 :(得分: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;
}
答案 3 :(得分: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>
答案 4 :(得分: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);