为什么无限循环?

时间:2014-10-16 05:23:48

标签: c++ infinite-loop

我试图找出数字是否是一个完美的正方形,但由于某种原因,我的代码进入无限循环并继续打印“是”。这是代码:

#include <iostream>

using namespace std;

int main()
{
  int N=0, n=0, l=1, u=0, mid;

  cin >> N;

  for (int i=0; i<N; ++i)
  {
    cin >> n;
    u=n;

    while (l <= u)  
    {   
      mid = (l+u)/2;

      if (n == mid*mid) 
      {   
        cout << "yes" << endl;
        continue;
      }   
      else if (n > mid*mid)
      {   
        l = mid+1;
      }
      else if (n < mid*mid)
      {
        u = mid-1;
      }
    }
    cout << "no" << endl;
  }
  return 0;
}

输入文件是:

15
1
2
4
9
16
25
35
753
23446
23423
5423
81
49
36
100
121

第一个条目是我们要检查的值的数量,在这种情况下是15。 我一遍又一遍地看着这段代码,仍然无法发现为什么我会得到无限循环。

4 个答案:

答案 0 :(得分:2)

    在for循环中
  1. ,你应该重置
  2.   

    L = 1

    1. continue更改为break

答案 1 :(得分:0)

你的方法需要一点点工作......你应该实现一些更简单的东西,如果你不能让你的工作。

使用的一些伪代码:

/* also note that you should add in conditions to make sure number 
   is positive, and greater than 2, and if it is two, to return 1   */

function check_if_perfect_square(int number) {
    int i = 2
    while (i*i <= number) {
        if (i*i == number) {
            print("perfect square");
            return 1;
        }
        ++i;
    }
    print("not a perfect square");
    return 0;
}

一次读取数字1并用函数检查它们......识别像你这样的问题的关键是模块化...在数据中有1个函数读数,1个函数检查它是否是一个完美的正方形<或者

答案 2 :(得分:0)

  if (n == mid*mid) 
  {   
    cout << "yes" << endl;
    continue;
  }  

'continue'再次从while循环的顶部继续执行。一旦(n == mid * mid)为真,它将保持为真,导致无限循环。

答案 3 :(得分:0)

您在外部循环的每次迭代的顶部重新初始化uu=n;},但您不会重新初始化l,因此它最终会以任何值结束它是在循环的前一次迭代中设置的。

尝试在l获取值的迭代结束时查看n的值 23446,23423和5423.如果最终设置为122或任何更大的值,则为 最后五次迭代while (l <= u)根本不会循环(因为l已经存在 大于u)你将直接打印出来#34; no&#34;。

您可以在设置l = 0;之前或之后立即尝试设置u = n; 看看是否有帮助。