枚举数组中连续值的所有三元组

时间:2014-05-13 12:27:03

标签: c arrays

无法找到此问题的解决方案: 考虑到数据的最后一个元素,枚举数组中连续值的所有三元组 将数组粘贴到第一个(注意这些三元组的数量正好等于N)。该程序必须使用C语言。

int main(int argc, const char * argv[])
{
    int v[DIM] = {10, 20, 30, 40, 50, 60, 70, 80};
    int i,sum,j,k,counter=DIM;

    for (i=0; i<DIM; i++) {
        sum = v[i];
        for (j=i; j<i+2; j++) {
            if (j>=DIM) {
                v[j] = v[0];
                v[j+1] = v[1];
                sum+=v[j];
            }
            sum += v[j+1];
        }
        printf("Triplet %d: %2d + %2d + %2d = %2d\n",i+1,v[i],v[i+1],v[i+2],sum);
    }

    printf("\n\n\n");
    return 0;
}

the correct output should be like this:
Triplet 1: 10 + 20 + 30 = 60
Triplet 2: 20 + 30 + 40 = 90
Triplet 3: 30 + 40 + 50 = 120
Triplet 4: 40 + 50 + 60 = 150
Triplet 5: 50 + 60 + 70 = 180
Triplet 6: 60 + 70 + 80 = 210
Triplet 7: 70 + 80 + 10 = 160 only in this step I'm getting wrong output:Triplet 7: 70 + 80 +  0 = 150
Triplet 8: 80 + 10 + 20 = 110

3 个答案:

答案 0 :(得分:1)

  

将数组的最后一个元素视为粘贴到第一个元素

执行此操作的常用方法是使用%运算符:

printf("Triplet %d: %2d + %2d + %2d = %2d\n",i+1,v[i],v[(i+1)%DIM],v[(i+2)%DIM],sum);

嵌套的for循环也应该被重写,因为它会破坏v的值,并且还会导致未定义的行为(此行v[j+1] = v[1];取消引用一个int超过阵列):

for (j=0; j<3; j++) {
    sum += v[(i+j)%DIM];
}

答案 1 :(得分:0)

这不是答案,而是代码问题,

    if (j>=DIM) {
        v[j] = v[0];
        v[j+1] = v[1];
        sum+=v[j];
    }

您的v数组只有DIM大小,所以您不应该超出它。在j>=DIM时,您不应该引用v[j]

答案 2 :(得分:0)

我认为这样做效果更好:

//Zero-th triplet
for (i=0; i<3; i++) sum += v[i];
printf("Triplet 0: %2d + %2d + %2d = %2d\n",v[0],v[1],v[2],sum);

//for next ones subtract unused element, and add the next one
for (i=1; i<DIM; i++) {
  sum -= v[i-1];
  sum += v[(i+2) % DIM]; // "wrapping" done by modulo
  printf("Triplet %d: %2d + %2d + %2d = %2d\n",i,v[i],v[(i+1)%DIM] ,v[(i+2)%DIM],sum);
}