系统地解决代数(蛮力法)
systematically solve algebra (brute force method)
我四处搜索并尝试了自己,但不太清楚该怎么做。
我有一个等式,比如说 a^2 + b^2 = c^2
。我想使用 JavaScript (node.js) 找出使这个等式成立的整数 a、b 和 c 必须是多少。显然我们知道它可以是很多东西(例如a = 3, b = 4, and c = 5
,但我只是在寻找计算机召集的第一个答案,无论答案是什么。唯一的规范是它必须是大于0的整数, 然后用蛮力法解决它,或者只是插入大量数字直到它为真。
我想到的 example/one 方法是:
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
}
如果等式不正确,我不知道该怎么办。我的想法是先给 a 加 1,然后从 a 减 1,然后给 b 加 1,依此类推,直到等式成立......有点像 this here
如果您对如何最好地做到这一点有任何想法,或者如果有人以前解决过这个问题但我找不到来源,请分享!
谢谢
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)
您正在获取从低到高的随机值。您检查之前是否有回答。然后你把它放在等式中并检查它是否为假,如果是,你得到新的随机数,否则你有很好的答案。
我喜欢这样的练习。我用递归调用做到了。
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);
我四处搜索并尝试了自己,但不太清楚该怎么做。
我有一个等式,比如说 a^2 + b^2 = c^2
。我想使用 JavaScript (node.js) 找出使这个等式成立的整数 a、b 和 c 必须是多少。显然我们知道它可以是很多东西(例如a = 3, b = 4, and c = 5
,但我只是在寻找计算机召集的第一个答案,无论答案是什么。唯一的规范是它必须是大于0的整数, 然后用蛮力法解决它,或者只是插入大量数字直到它为真。
我想到的 example/one 方法是:
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
}
如果等式不正确,我不知道该怎么办。我的想法是先给 a 加 1,然后从 a 减 1,然后给 b 加 1,依此类推,直到等式成立......有点像 this here
如果您对如何最好地做到这一点有任何想法,或者如果有人以前解决过这个问题但我找不到来源,请分享!
谢谢
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)
您正在获取从低到高的随机值。您检查之前是否有回答。然后你把它放在等式中并检查它是否为假,如果是,你得到新的随机数,否则你有很好的答案。
我喜欢这样的练习。我用递归调用做到了。
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);