【问题标题】:systematically solve algebra (brute force method)系统地解决代数(蛮力法)
【发布时间】:2023-03-11 05:18:01
【问题描述】:

我已经四处搜索并尝试过自己,但不知道该怎么做。

我有一个方程式,比如a^2 + b^2 = c^2。我想使用 JavaScript (node.js) 找出整数 a、b 和 c 必须是什么才能使这个等式成立。显然我们知道它可能是很多东西(例如a = 3, b = 4, and c = 5,但我只是在寻找计算机必须的第一个答案,无论答案如何。唯一的规范是它必须是大于0的整数,并且用蛮力的方法解决它,或者只是插入大量的数字直到它是真的。

我想到的一个例子/一种方法是:

var
  a = 1;
  b = 1;
  c = 1;

if (Math.pow(a,2) + Math.pow(b,2) === Math.pow(c,2)) {
    console.log('you did it!');
} else {
    //something such as a++ or idk
  }

如果等式不正确,我不知道该怎么办。我的想法是首先将 1 加到 a,然后从 a 中减去 1,然后将 1 加到 b,依此类推,直到等式为真……有点像 this here

如果您对如何最好地做到这一点有任何想法,或者如果有人以前解决过这个问题并且我找不到源,请分享!

谢谢

【问题讨论】:

  • 您可能想查找生成毕达哥拉斯三元组的公式

标签: javascript node.js brute-force


【解决方案1】:
let a,b,c
let high = 100
let low = 1
let checkedValues = []
do {
    a = Math.round(Math.random() * (high - low) + low)
    b = Math.round(Math.random() * (high - low) + low)
    c = Math.round(Math.random() * (high - low) + low)
    if(checkedValues.find(arr => arr.every((v,i)=> v === [a,b,c][i]))) continue
    checkedValues.push([a,b,c])
} while(Math.pow(a,2) + Math.pow(b,2) !== Math.pow(c,2))

console.log('You found a = ', a, ' b = ', b, ' c = ', c)

你得到从低到高的随机值。您检查之前是否出现过答案。然后你把它放在等式中并检查它是否为假,如果是,你得到新的随机数,否则你有很好的答案。

【讨论】:

  • 有没有办法让它不再发生组合?显然机会非常渺茫,但如果a = 1, b = 39, and c = 94 已经被证明是错误的,你能输入一些东西来使这个答案变得不需要吗?它实际上可能会使程序变慢,不是吗...
  • 已编辑,首先我们生成随机值,如果它们在checkedValues中我们跳过,否则我们将其添加到checkedValues并计算方程。
【解决方案2】:

我喜欢这种练习。我通过递归调用做到了。

var checkValues = function(a, b, c) {
    if (Math.pow(a,2) + Math.pow(b,2) === Math.pow(c,2)) {
        return true;
    }
    return false;
}



var MIN = 1;
var MAX = 20;
var a = b = c = MIN;

var valuesGenerator = function(a, b, c) {
console.log("trying: " + a + ' - ' + b + ' - ' + c);
    if(checkValues(a, b, c)) {
        console.log('you did it!');
        console.log("Solution: a - " + a + "   b - " + b + "    c - " + c);
        process.exit();
    }

    // Not got it yet
    if(++c >= MAX) {
        c = MIN;
        if(++b >= MAX) {
            b = MIN;
            if(++a >= MAX) {
                console.log('It seams we did not get a solution :(');
                process.exit();
            }
        }
    }

    // Try new values
    valuesGenerator(a, b, c);
}

valuesGenerator(a, b, c);

【讨论】:

  • 我喜欢您系统地执行此操作的方式,唯一的问题是在我收到RangeError: Maximum call stack size exceeded 的第 14000 次之后,可能是因为我的电脑没有崩溃哈哈
  • 可能是Node对调用次数或堆栈大小的限制,可以修改。为了让它工作,只需减少 MAX 的数量。也许用 10 就可以了
  • 是的哈哈,我就是想看看它能有多大,效果很好!谢谢
猜你喜欢
  • 1970-01-01
  • 2013-04-05
  • 1970-01-01
  • 1970-01-01
  • 2016-03-02
  • 1970-01-01
  • 1970-01-01
  • 2015-01-10
  • 2020-02-16
相关资源
最近更新 更多