我应该写一个" bisquare"返回一系列数字中的bisquare数量的方法。我以为我已经弄明白了,但是当我运行这段代码时,没有任何东西显示出来,我的笔记本电脑开始疯狂地旋转。系统从未说过它已完成。
这是我的代码。我究竟做错了什么? (如果我没有正确设置,我也在寻找问题的解决方案。)
// An integer that is the sum of the squares of two other integers is called bisquare
// 5 is bisquare because it is 1*1 + 2*2
// 4 is bisquare because it is 0*0 + 2*2 (we can use 0 as one of our numbers)
// 8 is bisquare because it is 2*2 + 2*2 (we can use the same two numbers)
// 3 is not bisquare, 6 is not bisquare
//
// Given two int parameters, low and high, return the number of bisquares that
// fall between low and high (inclusive)
//
// EXAMPLES:
// low = 1, high = 6
// return 4
// 1, 2, 4, and 5 are bisquare. 3 and 6 are not
//
// low = 7, high = 7
// return 0
// 7 is not bisquare. that is the entire range we are checking.
public static int bisquare(int low, int high)
{
int count = 0;
boolean isBisquare = false;
for (int checkNum = low; checkNum < high; checkNum++) {
while (!isBisquare) {
for (int i = 0; i < high; i++) {
for (int j = 0; j < high; j++) {
if ((i*i) + (j*j) == low) {
count++;
isBisquare = true;
}
}
}
}
}
return count;
}
答案 0 :(得分:4)
是,
如果(i*i) + (j*j) == low
没有一个评估为真,则while将无限循环。
答案 1 :(得分:1)
您没有正确使用checkNum
变量。它应该用在内部的两个for循环中。此外,while
循环是不必要的,并为不是双方的数字创建无限循环。
public static int bisquare(int low, int high)
{
int count = 0;
for (int checkNum = low; checkNum < high; checkNum++)
{
outerloop:
for (int i = 0; i < checkNum; i++)
{
for (int j = 0; j < checkNum; j++)
{
if (i * i + j * j == checkNum)
{
count++;
break outerloop;
}
}
}
}
return count;
}
为清楚起见,您可能还应考虑创建一个isBisquare(int)
方法,如下所示:
public static boolean isBisquare(int n)
{
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
{
if (i * i + j * j == n)
{
return true;
}
}
}
return false;
}
bisquare
方法(应该有一个更好的名称,比如countBisquares
)现在看起来像这样:
public static int countBisquares(int low, int high)
{
int count = 0;
for (int checkNum = low; checkNum < high; checkNum++)
{
if (isBisquare(checkNum))
{
count++;
}
}
return count;
}
答案 2 :(得分:1)
您的代码存在一些问题。
首先是循环
while (!isBisquare) {
// some code
}
此循环中的代码每次都以完全相同的方式执行,因此如果循环中的代码第一次执行时没有找到bisquare,则biSquare不会设置为true,并且在进一步的迭代中不会设置为true ,导致无限循环。
第二个问题是这一行:
if ((i*i) + (j*j) == low) {
我认为这应该是
if ((i*i) + (j*j) == checkNum) {
否则你总是检查范围内的最低数字是否是双方。
结合这两个错误,只要参数low不是bisquare,就会得到一个无限循环,无论high值是多少。
编辑:最初我没有注意到你对while循环的意图。在阅读了一些讨论后,我意识到这是为了防止多次计算一个数字。我建议使用@Clashsoft的第二个解决方案。这使代码更具可读性和可重用性。
答案 3 :(得分:0)
你的逻辑不正确。以下是正确的:
public static int bisquare(int low, int high) {
int count = 0;
boolean isBisquare = false;
for (int checkNum = low; checkNum < high; checkNum++) {
for (int i = 0; i < checkNum && !isBisquare; i++) {
for (int j = 0; j < checkNum && !isBisquare; j++) {
if (((i * i) + (j * j)) == checkNum) {
count++;
isBisquare = true;
}
}
}
isBisquare = false;
}
return count;
}
答案 4 :(得分:0)
我已经尝试了上述一些解决方案,我相信我在上述所有解决方案中都发现了错误。在for循环的 all 中,checkNum应小于或等于高,i或j应小于或等于 checkNum。
进行这些更改将给出答案7,当给出高10和低1时,如果没有这些变化,给出相同输入的答案是5。
除非做出这种改变,否则它不会认为它会计算实际的高值和低值。