我认为我的逻辑是错误的,但我不明白我在哪里犯了错误。我正在尝试找到大公约数,代码将确定如果 a 大于 b 或 b 大于 a 时该怎么做。
我尝试了很多循环,if,while,但最终我删除了所有循环以清除视线。我制作了流程图,但它没有随我的代码一起提供。
var a = 64;
var b = 12;
var newA;
while(a > b && newA != 0){
newA = a - b;
if(newA === 0){
outputObj.innerHTML = outputObj.innerHTML + "GCD is " + b;
}
}
while(a < b && newA != 0){
newA = b - a;
}
if(newA === 0){
outputObj.innerHTML = outputObj.innerHTML + "GCD is " + a;
}
}
如果 a 为 64,b 为 12,则 GCD 为 4,如果 a 为 35,b 为 42,则 GCD 为 7
最佳答案
您遇到了一些不同的问题。这看起来像 homework ,所以我会尝试为您指出几个问题的正确方向,而不是例如准确地告诉您代码应该说什么。
- 在循环中,您永远不会更新
a
或b
的值。 - 假设该问题已解决,您的代码将从
b
中多次减去a
,或者从a
中减去b
> 很多次。这样做会计算一个数字除以另一个数字的余数,而不是计算最大公约数。- 我敢打赌,您已经了解了计算最大公约数的算法。再次通读它,将其功能与您的代码的功能进行比较。
这里有一个强大的方法来查找此类代码中的问题:尝试在你的脑海中运行它,假装你是计算机。一步一步地完成计算机会做的事情。对于上面的代码,它可能会这样开始:
- 好的,我有名为
a
和b
的变量,其值分别为 64 和 12。还有一个名为newA
的变量,其值分别为 64 和 12。尚未指定值。 - 现在我需要检查
a
是否大于b
—— 是的,是 —— 然后检查newA
是否为零。- 等等,此时我还没有给
newA
一个值。 (您在这里发现了一个错误。让我们假设它已修复并继续。)
- 等等,此时我还没有给
- 现在我将
newA
设置为a-b
,即 52。 - 现在我检查
newA
是否为零,事实并非如此,因此我不需要在if
block 内执行这些操作。 - 好的,我们已经完成了
while
循环的一次迭代。回到循环的开头。 - 现在我需要检查
a
是否大于b
—— 是的,是 —— 然后检查newA
是否为零。- 等一下,我正在检查与上次完全相同的内容:没有任何变化。这个循环将如何结束? (您在此处发现了另一个错误。)
等等。
关于javascript - 带循环的最大公约数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58600514/