无法找到此问题的解决方案: 考虑到数据的最后一个元素,枚举数组中连续值的所有三元组 将数组粘贴到第一个(注意这些三元组的数量正好等于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
答案 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);
}