【问题标题】:The sum of middle elements of an array using a C program使用 C 程序计算数组中间元素的总和
【发布时间】:2016-04-05 10:05:41
【问题描述】:

如果数组的和为 15,我如何找到中间元素的总和或检查条件?

例如,数组 {3, 2, 10, 4, 1, 6, 9} 以 15 为中心,因为序列 10, 4, 1 sums15 并且序列位于前面由两个元素(32)和后跟两个元素(69)。

所以返回1,因为序列10, 4, 1 总和为15,并且前面有两个元素,后面有两个元素。请注意,还有另一个序列总和为1569)。数组可以有多个序列的总和为15,只要其中至少一个居中即可。

同样,对于数组 {2, 10, 4, 1, 6, 9},返回 0,因为 (10, 4, 1) 前面有一个元素,后面有两个。 (9, 6) 前面有五个元素,但后面没有。因此,两者都不是居中的。

int isCentered5(int a[ ], int len) {
    int sum=0;

    for(int i=0;i<len;i++){
        sum+=a[i];
    }

    //check if sum less than 15
    if(sum<15){
        printf("Sum of all elements are less than 15");
    }

    //check if even terms- we need odd terms to find middle sum
    elseif(len%2==0){
        printf("There should be odd lenght of array to find middle sum");
    }
    else{
        //check if middle sum of array is 15?
        //can you help me here,how can i check is middle term sum is 15 or not
        for(int i=0;i<len;i++){

        }
    }
}

int isCentered5(int a[ ], int len);//function declaration

int main() {
}

【问题讨论】:

  • 您对 centered-15 的定义很罗嗦,但不是很清楚。总和必须由三个元素组成吗? (如果不是,检查奇数个元素就没有意义了。)或者只要左边的元素数量与左边的元素数量一样多,中心的任何数量的元素总和为 15 就足够了正确的?元素和等于 15 的数组是中心 15 的特例吗?

标签: c arrays


【解决方案1】:

我们应该澄清我们使用的术语:

如果在它的右边和左边有同样多的元素,则一个序列是居中的

输入数组A的长度为n

如果我们使用这些定义,我们应该只考虑由以下定义的序列:

  1. max_p = (n-1)/2
  2. p[0..max_p]
  3. 序列是输入数组中索引属于[p, (n-1)-p]的元素

编写一个循环p 的可能值然后将索引p(n-1)-p 的数组元素求和的程序应该很简单。

这将导致至少O(n²) 操作。

你也可以注意到索引ij的元素之和,我们称之为S(i,j)i+1j-1的元素之和加上A[i]+A[j]

S(i,j) = S(i+1,j-1) + A[i] + A[j]

此观察结果应引导您使用O(n) 操作和单个循环的算法。

int is_centered_15(int A[], int n) {
    int max_p = (n-1)/2;
    int sum = 0;
    int p = max_p;   // left index
    int q = (n-1)-p; // right index

    // if initially p==q we will sum twice the same element
    // we need to correct the sum by canceling the extra
    // addition
    if(p==q)
        sum -= A[p];

    for(; p>=0; --p, ++q) {
        sum += A[p]+A[q];
        if(15 == sum) {
            // do what we should do if we find a sequence
            ...
            return 1;
        }
    }
    return 0;
}

请注意,此算法可以处理输入数组中的正负值。

【讨论】:

  • 我也会将&amp;&amp; sum &lt; 15 添加到for 条件中。
  • @Bob__ 为什么? OP 没有声明只允许非负值。碰巧他的例子就是这样。如果他只想使用非负值,他可以使用unsigned 而不是int
  • 不,我只是说当总和超过15时停止迭代。
  • @Bob__ 如果我们允许负值,那不应该停止迭代。举个例子:{-8, 30, -7}
【解决方案2】:

假设我们谈论的是中间三个, 从设计的角度来看:检查奇数,如果不是返回 0。 然后从整个数组中减去 3,并将余数除以 2。 然后你从数组中的这个数量的元素开始,添加 3 次,然后再进行检查。

我刚才所说的代码示例:

{
    if(len%2==0)
    {
        return 0;
    }
    int a,b=0,sum=0;
    a=len-3;
    a/=2;
    for (;b<3;b++)
    {
        next=array[a+b];
        sum+=next;
    }
    if (sum==15)
    {
        return 1;
    }
    return 0;
}

【讨论】:

    猜你喜欢
    • 2021-07-19
    • 1970-01-01
    • 2020-09-17
    • 2022-01-16
    • 2021-06-05
    • 2017-07-15
    • 1970-01-01
    • 1970-01-01
    • 2021-10-12
    相关资源
    最近更新 更多