【发布时间】:2018-05-18 13:06:27
【问题描述】:
这是一个关于 Codewars 的作业,换句话说,就像一个家庭作业。 :)
我必须编写一个函数来返回 1 和 n(含)之间的数字数量,可以表示为两个完美正方形的差。例如,20 = 6² - 4² 和 21 = 5² - 2²。许多数字都可以这样写,但不是全部。
我写了一个函数,它运行良好,但它需要能够处理n 的值,最高可达45000。基本上,我的代码在分析数千个数字时会崩溃。为了使代码更高效,我尝试反转初始循环,从n 到0,而不是从0 到n。我试图将n 除以二,直到它变得足够小,然后再次将最终结果乘以 2,但没有奏效。我也使用了while 循环,但后来我意识到我根本不知道如何解决这个问题,经过 3 天毫无意义的暴力尝试解决它后,我正在寻求帮助,因为我没有想干脆放弃吧。这是我的代码
function countSquareable(n){
var y = []
var c = []
for (var i = 0; i <= n; i++) { // all numbers powered in range
y.push(Math.pow(i,2))
}
for(i = 0; i < y.length; i++) {
c.push(y.map(a => y[i]-a)) // all subtractions' combos
}
var d = c.toString().split(",").sort(function(a, b){return a-b}).filter(function(a) {return a>0 && a<=n}) // only the combos I need in the range
var a = [], b = [], prev; // remove duplicates
d.sort();
for ( var i = 0; i < d.length; i++ ) {
if ( d[i] !== prev ) {
a.push(d[i]);
b.push(1);
} else {
b[b.length-1]++;
}
prev = d[i];
}
return console.log(a.length) // end result
};
countSquareable(500)
countSquareable(4) // should return 3 and it works
countSquareable(5) // should return 4 and it works
countSquareable(40) // should return 30 and it works
countSquareable(45000) // should return 33750 but crashes
countSquareable(6427), // should return 4820 but crashes
如何让代码更有效地解决问题? 卡塔是here。 谢谢!!
【问题讨论】:
-
第一:不要使用Math.Pow(x, 2),而是使用x*x
-
不知道这背后的数学原理,但是 n = a²-b² 和 a,b > n 是一个有效的解决方案吗?
-
也许可以,但我需要返回满足该条件的确切数字数量
-
@RegisPortalez:数学不支持它。
a^2 - b^2 = (a - b) * (a + b),所以如果任一(正)项是> n,那么(a + b) > n,整个表达式太大了。
标签: javascript loops for-loop while-loop coding-efficiency