- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
这是 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 。谢谢!!
最佳答案
这可以通过少量的数学计算来完成。
如果您可以列出它们,而不是计算值,例如 30 个值等于 40 个值,您将得到
[1, 3, 4, 5, 7, 8, 9, 11, 12, 13, 15, 16, 17, 19, 20, 21,
23, 24, 25, 27, 28, 29, 31, 32, 33, 35, 36, 37, 39, 40]
如果很难看出那里的模式,请尝试大声朗读。关键是这些群体很容易成为
[ 1,
3, 4, 5,
7, 8, 9,
11, 12, 13,
15, 16, 17,
19, 20, 21,
23, 24, 25,
27, 28, 29,
31, 32, 33,
35, 36, 37,
39, 40, (41)]
换句话说,从 2 开始,每四个数字都会丢失。下面是遵循该模式的代码:
const range = (lo, hi) => Array(...Array(hi - lo + 1)).map((_, n) => lo + n)
const countSquareable = (n) => range(1, n).filter(n => n % 4 !== 2).length
console.log(countSquareable(4))
console.log(countSquareable(5))
console.log(countSquareable(40))
console.log(countSquareable(45000))
所以它符合预期。但我们现在处于数学领域,所以我们需要证明一些事情。我们可以在三种情况下执行此操作:
n
表示为平方差?n
是奇数让a = (n + 1) / 2
,让b = (n - 1) / 2
.
自 n
是奇数,n - 1
和n + 1
是偶数,所以a
和b
都是整数。
a^2 = (n^2 + 2n + 1) / 4
b^2 = (n^2 - 2n + 1) / 4
所以
a^2 - b^2 = 4n / 4 = n
因此,奇数可以表示为平方差。
让a = (n / 4 + 1)
,令 b = (n / 4 - 1)
自 n
能被 4 整除,(n / 4) is an integer and thus
一个and
b` 是整数。
现在
a^2 = (n^2/16 + 2n/4 + 1)
b^2 = (n^2/16 - 2n/4 + 1)
和
a^2 - b^2 = 4n/4 = n
因此,4的倍数可以表示为平方差。
我们可以这样划分整数:(4n), (4n + 1), (4n + 2), (4n + 3)
.
对每一个进行平方,并选择合适的 k
我们得到:
(4n)^2 = 16n^2 = 4 * 4n^2 = (4k)
(4n + 1)^2 = (16n^2 + 8n + 1) = 4(4n^2 + 2n) + 1, = (4k + 1)
(4n + 2)^2 = (16n^2 + 16n + 4) = 4(4n^2 + 4n + 1) = (4k)
(4n + 3)^2 = (16n^2 + 24n + 9) = 4(4n^2 + 6n + 2) + 1 = (4k + 1)
因此,正方形除以 4 时唯一可能的余数是 0 和 1。
减去这些,我们得到 (1 - 0) = 1
, (1 - 1) = 0
, (0 - 0) = 0
, (0 - 1) = -1
(最后一个与 3 的余数相同:4k - 1 = 4(k -1) + 3。)
这样我们就可以得到 0
的余数, 1
,或3
。但我们无法得到2
。
因此,不是 4 的倍数的 2 的倍数不能表示为平方差。
Q.E.D。我们已经证明了我们的直觉是正确的:任何整数都可以写成平方差,除了那些是 2 的倍数但不是 4 的倍数的整数。
<小时/>我的原始代码是一种暴力方法,注意到 a^2 - b^2 = (a - b) * (a + b)
因此,如果乘积小于 (a - b)
,则较小的因子( n
)必须小于我们的最高数字的平方根。 。然后我尝试了 b
所有可能的值,节省(a^2 - b^2)
如果小于n
。这有效,并且对于 45000
来说似乎足够高效。案件。但它忽略了上面的分析。
无论如何,这是该版本:
const countSquareable = (n) => {
const found = new Set()
// a^2 - b^2 = (a - b)(a + b), so (a - b) can be no larger than sqrt(n)
const topDiff = Math.sqrt(n)
for (let diff = 1; diff <= topDiff; diff++) {
const topB = n / 2 // can we get a tighter bound here?
for (let b = 0; b < topB; b++) {
let a = b + diff
const val = (a * a) - (b * b)
if (val <= n) {
found.add(val)
}
}
}
//console.log([...found].sort((a, b) => a - b))
return found.size
}
console.log(countSquareable(45000))
关于javascript - 使循环和代码更有效地使用循环处理大量数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50412022/
我在网上搜索但没有找到任何合适的文章解释如何使用 javascript 使用 WCF 服务,尤其是 WebScriptEndpoint。 任何人都可以对此给出任何指导吗? 谢谢 最佳答案 这是一篇关于
我正在编写一个将运行 Linux 命令的 C 程序,例如: cat/etc/passwd | grep 列表 |剪切-c 1-5 我没有任何结果 *这里 parent 等待第一个 child (chi
所以我正在尝试处理文件上传,然后将该文件作为二进制文件存储到数据库中。在我存储它之后,我尝试在给定的 URL 上提供文件。我似乎找不到适合这里的方法。我需要使用数据库,因为我使用 Google 应用引
我正在尝试制作一个宏,将下面的公式添加到单元格中,然后将其拖到整个列中并在 H 列中复制相同的公式 我想在 F 和 H 列中输入公式的数据 Range("F1").formula = "=IF(ISE
问题类似于this one ,但我想使用 OperatorPrecedenceParser 解析带有函数应用程序的表达式在 FParsec . 这是我的 AST: type Expression =
我想通过使用 sequelize 和 node.js 将这个查询更改为代码取决于在哪里 select COUNT(gender) as genderCount from customers where
我正在使用GNU bash,版本5.0.3(1)-发行版(x86_64-pc-linux-gnu),我想知道为什么简单的赋值语句会出现语法错误: #/bin/bash var1=/tmp
这里,为什么我的代码在 IE 中不起作用。我的代码适用于所有浏览器。没有问题。但是当我在 IE 上运行我的项目时,它发现错误。 而且我的 jquery 类和 insertadjacentHTMl 也不
我正在尝试更改标签的innerHTML。我无权访问该表单,因此无法编辑 HTML。标签具有的唯一标识符是“for”属性。 这是输入和标签的结构:
我有一个页面,我可以在其中返回用户帖子,可以使用一些 jquery 代码对这些帖子进行即时评论,在发布新评论后,我在帖子下插入新评论以及删除 按钮。问题是 Delete 按钮在新插入的元素上不起作用,
我有一个大约有 20 列的“管道分隔”文件。我只想使用 sha1sum 散列第一列,它是一个数字,如帐号,并按原样返回其余列。 使用 awk 或 sed 执行此操作的最佳方法是什么? Accounti
我需要将以下内容插入到我的表中...我的用户表有五列 id、用户名、密码、名称、条目。 (我还没有提交任何东西到条目中,我稍后会使用 php 来做)但由于某种原因我不断收到这个错误:#1054 - U
所以我试图有一个输入字段,我可以在其中输入任何字符,但然后将输入的值小写,删除任何非字母数字字符,留下“。”而不是空格。 例如,如果我输入: 地球的 70% 是水,-!*#$^^ & 30% 土地 输
我正在尝试做一些我认为非常简单的事情,但出于某种原因我没有得到想要的结果?我是 javascript 的新手,但对 java 有经验,所以我相信我没有使用某种正确的规则。 这是一个获取输入值、检查选择
我想使用 angularjs 从 mysql 数据库加载数据。 这就是应用程序的工作原理;用户登录,他们的用户名存储在 cookie 中。该用户名显示在主页上 我想获取这个值并通过 angularjs
我正在使用 autoLayout,我想在 UITableViewCell 上放置一个 UIlabel,它应该始终位于单元格的右侧和右侧的中心。 这就是我想要实现的目标 所以在这里你可以看到我正在谈论的
我需要与 MySql 等效的 elasticsearch 查询。我的 sql 查询: SELECT DISTINCT t.product_id AS id FROM tbl_sup_price t
我正在实现代码以使用 JSON。 func setup() { if let flickrURL = NSURL(string: "https://api.flickr.com/
我尝试使用for循环声明变量,然后测试cols和rols是否相同。如果是,它将运行递归函数。但是,我在 javascript 中执行 do 时遇到问题。有人可以帮忙吗? 现在,在比较 col.1 和
我举了一个我正在处理的问题的简短示例。 HTML代码: 1 2 3 CSS 代码: .BB a:hover{ color: #000; } .BB > li:after {
我是一名优秀的程序员,十分优秀!