如何在数组中查找元素,以使左数组的总和等于右数组的总和

时间:2019-01-16 20:46:53

标签: c++ arrays turbo-c++

这是代码应生成的输入和输出:

  • 输入:1 4 2 5 0
  • 输出:2

说明:如果2是分区,则:1+ 4=5(LHS)5+0=5(RHS)应该打印2,但是在我的情况下,我没有得到输出。

我尝试了使用以下逻辑的代码:第n个元素将出现在数组之间的某个位置。因此,考虑到arr的元素之和,直到第n个元素将是LHS,从第n个元素开始,直到arr的末尾即RHS。我还添加了一个while循环,该循环增加了指向元素n。

#include <iostream.h>
#include <conio.h>
void main(){
   int arr[5],arr2[5],i,j=0,k=0,n=1;
   cout<<"input_arr\n";
   for(i=0;i<5;i++)
    cin>>arr[i];

   while(n<=5)
{
   for(i=n;i<5;n++)
      j+=arr[i];   //sum of right side arr from n-th   element
   for(i=0;i<n;i++)
    k+=arr2[i];  //sum of left side arr till n-th element
   if(k==j)
    cout<<"\n"<<arr[n];  // prints the equilbrium element
   else
         n++;
}
    getch();
}

3 个答案:

答案 0 :(得分:0)

我会给您一些提示,以指导您解决问题:

  1. 一遍计算数组中的总和。我们称之为 totalSum
  2. 第二遍,计算 partialSum ,直到您处理的位置(但不包括)。假设这是 i ,其值为 a [i] 。如果为totalSum - partialSum - a[i] = partialSum,则位置 i 是您的答案,而 a [i] 是其值。

答案 1 :(得分:0)

首先,如果我理解正确,则希望使用此方法在每次迭代中重置j,k。

第二,出于某种原因,第二个for循环将n而不是i递增。

第三,您还要声明arr2,而不是对其进行初始化,并出于某种原因将arr2中的值添加到k。

您还包括中位数。尝试n =2。

j = arr [2] + arr [3] + arr [4] = 2 + 5 + 0 = 7
k = arr [0] + arr [1] = 1 + 4 = 0

对while循环的建议更改(以保持相同的方法):

while (n <= 5) {
    j = 0; k = 0;
    for (i = n+1; i < 5; i++) {
        j+= arr[i];
    }
    for (i = 0; i < n; i++) {
        k+= arr[i]
    }
    if (k == j) {
        cout << "\n" << arr[n];
        break; //you should end the for loop here
    }
    n++;
}

答案 2 :(得分:0)

当您对数组的右侧求和时,您将从均衡元素开始:

假设n = 2,您输入的是[1, 4, 2, 5, 0]

while(n<=5) {
  for(i=n;i<5;n++)
      j+=arr[i];   //sum of right side arr from n-th   element
}

数组右侧的总和将从i = 2开始,因此它将是2 + 5 + 0而不是5 + 0

调试此类问题的一种快速简便的方法是打印每个步骤的操作(在您的情况下,它选择要汇总的索引),以便您可以快速诊断您是否在做您不应该做的事情

此外,您当前的方法不是最佳方法,但这是一个很好的起点。我敦促您在使此解决方案生效后尝试其他方法。