c++ 我试运行了很多次,但代码无法正常工作

jm81lzqq  于 2022-12-30  发布在  其他
关注(0)|答案(3)|浏览(164)

我已经试运行了很多次,但是代码不能正常工作。如果我用公式代替循环,那么它是工作的,但是在循环的情况下,它是不工作的。请检查循环中的错误是什么,什么将是正确的代码。

#include <iostream>
using namespace std;

int main()
{
    int n;
    cout << "enter value of n = ";
    cin >> n;
    int pivotNumber = 1;
    int sum1 = 0;
    int sum2 = 0;
    while (pivotNumber <= n)
    {
        for (int i = 1; i <= pivotNumber; i++)
        {
            sum1 = sum1 + i;
        }
        for (int j = pivotNumber; j <= n; j++)
        {
            sum2 = sum2 + j;
        }
        if (sum1 == sum2)
        {
            cout << "pivotNumber = " << pivotNumber;
            break;
        }
        pivotNumber++;
    }

    if (pivotNumber > n)
    {
        cout << -1 << "\n";
    }
}
eaf3rand

eaf3rand1#

循环sum1和sum2应该在while循环内初始化

#include <iostream>
using namespace std;

int main()
{
    int n;
    cout << "enter value of n = ";
    cin >> n;
    int pivotNumber = 1;

    while (pivotNumber <= n)
    {
        int sum1 = 0;
        int sum2 = 0;
        for (int i = 1; i <= pivotNumber; i++)
        {
            sum1 = sum1 + i;
        }
        for (int j = pivotNumber; j <= n; j++)
        {
            sum2 = sum2 + j;
        }
        // cout<<sum1<<' '<<sum2;
        if (sum1 == sum2)
        {
            cout << "pivotNumber = " << pivotNumber;
            break;
        }
        pivotNumber++;
    }

    if (pivotNumber > n)
    {
        cout << -1 << "\n";
    }
}
rqdpfwrv

rqdpfwrv2#

你的错误很简单(也很常见)

int sum1 = 0;
int sum2 = 0;
while (pivotNumber <= n)
{
    ...
}

应该是

while (pivotNumber <= n)
{
    int sum1 = 0;
    int sum2 = 0;
    ...
}

在您的版本中,当您开始测试一个新的透视数字时,您仍然拥有来自前一个透视数字的旧值sum1sum2。您应该在while循环中声明sum1sum2,以便每个透视数字的和都以零开始。

7xzttuei

7xzttuei3#

其他的答案会引导你朝着正确的方向去解决你的bug,但是当N变大时,你的解决方案可能需要很长时间才能运行,这是一个O(N²)的解决方案。
我们可以跳过求和循环,利用二进制搜索。
在1..X之间的任何数列的和是((1+X)*2) / 2
例如,g 1+2+3+4+5 = (1+5)*5/2 == 6*5/2 == 30/2 == 15
更一般地说,X..N之间的任何数列的和是((X+N) * (N-X+1))/2
例如,g 6+7+8+9 = (6+9)*(9-6+1)/2 == 15*4/2 == 30
因此,您可以执行快速二进制搜索来查找主元,如下所示:

int low = 1;
   int high = n;
   while (low < high) {

      int pivot = (low+high)/2;
      int leftSum = ((1+pivot)*pivot)/2;        // SUM of 1..X
      int rightSum = ((n-pivot+1)*(pivot+n))/2; // SUM of X..N

      if (leftSum == rightSum) {
         return pivot;
      }

      if (leftSum < rightSum) {
         low = pivot + 1;
      } else {
         high = pivot - 1;
      }
   }
   return -1;

时间复杂度O(N)

相关问题