我已经试运行了很多次,但是代码不能正常工作。如果我用公式代替循环,那么它是工作的,但是在循环的情况下,它是不工作的。请检查循环中的错误是什么,什么将是正确的代码。
#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";
}
}
3条答案
按热度按时间eaf3rand1#
循环sum1和sum2应该在while循环内初始化
rqdpfwrv2#
你的错误很简单(也很常见)
应该是
在您的版本中,当您开始测试一个新的透视数字时,您仍然拥有来自前一个透视数字的旧值
sum1
和sum2
。您应该在while循环中声明sum1
和sum2
,以便每个透视数字的和都以零开始。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
因此,您可以执行快速二进制搜索来查找主元,如下所示:
时间复杂度O(N)