我试图找出数字是否是一个完美的正方形,但由于某种原因,我的代码进入无限循环并继续打印“是”。这是代码:
#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。 我一遍又一遍地看着这段代码,仍然无法发现为什么我会得到无限循环。
答案 0 :(得分:2)
L = 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)
您在外部循环的每次迭代的顶部重新初始化u
(u=n;
},但您不会重新初始化l
,因此它最终会以任何值结束它是在循环的前一次迭代中设置的。
尝试在l
获取值的迭代结束时查看n
的值
23446,23423和5423.如果最终设置为122或任何更大的值,则为
最后五次迭代while (l <= u)
根本不会循环(因为l
已经存在
大于u
)你将直接打印出来#34; no&#34;。
您可以在设置l = 0;
之前或之后立即尝试设置u = n;
看看是否有帮助。