- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试解决 Codewars 中的这个 Kata:https://www.codewars.com/kata/simple-fun-number-258-is-divisible-by-6/train/javascript
这个想法是,将一个数字(表示为字符串)的一位数字替换为*,例如“1047*66”,将被插入到函数中。您必须返回一个数组,其中的值是原始数字,并将 * 替换为任何能除以 6 的数字。因此,给定“1*0”,正确的结果数组应该是 [120, 150, 180] .
我有一些代码产生了一些正确的结果,但对其他结果却产生了错误,我不明白为什么。代码如下:
function isDivisibleBy6(s) {
var results = [];
for(i=0;i<10;i++) {
var string = i.toString(); // Convert i to string, ready to be inserted into s
var array = Array.from(s); // Make an array from s
var index = array.indexOf("*"); // Find where * is in the array of s
array[index] = string; // Replace * with the string of i
var number = array.join(""); // Join all indexes of the s array back together. Now we should have
// a single number expressed as a string, with * replaced with i
parseInt(number, 10); // Convert the string to an integer
if((number % 6) == 0) {
results.push(number);
} // If the integer is divisible by 6, add the integer into the results array
}
return(results);
};
此代码适用于上面的示例,并且通常适用于所有较小的数字。但它会在较大的数字上产生错误。例如,当 s 为“29070521868839*57”时,输出应为 []。但是,我得到 ['29070521868839257','29070521868839557','29070521868839857']。我不明白这会出什么问题。有人可以帮忙吗?
最佳答案
问题是这些数字大于 Number.MAX_SAFE_INTEGER
- JavaScript 数字在可靠性方面崩溃的时刻:
var num = 29070521868839257;
console.log(num > Number.MAX_SAFE_INTEGER);
console.log(num % 6);
console.log(num)
最后一条日志显示num
实际上它的值与我们赋予它的值不同。这是因为29070521868839257
根本无法用 JavaScript 数字表示,因此您会得到可以表示的最接近的可能值,即 29070521868839256
.
因此,在数字中的某个点之后,所有数学运算都变得不可靠,因为这些数字不精确。
您可以做的就是忽略将整个数字视为数字 - 将其视为字符串并仅应用 principles of divisibility 。这使得任务变得更加容易。
对于可被6
整除的数字它必须涵盖两个标准:
2
整除。
2
整除。 。例如29070521868839257
如果我们取 7
,然后检查7 % 2
,我们得到1
这意味着这很奇怪。我们不需要考虑整个数字。3
整除。
3
整除。 。如果我们将 29070521868839257
中的所有数字相加我们得到2 + 9 + 0 + 7 + 0 + 5 + 2 + 1 + 8 + 6 + 8 + 8 + 3 + 9 + 2 + 5 + 7 = 82
不能被3
整除。如果有疑问,我们可以再次对数字进行求和,因为该规则可以应用于任何超过两位数的数字:8 + 2 = 10
和1 + 0 = 1
。这仍然不能被3
整除.所以,如果我们应用这些,我们可以得到类似的结果:
function isDivisibleBy6(s) {
return isDivisibleBy2(s) && isDivisibleBy3(s);
};
function isDivisibleBy2(s) {
var lastDigit = Number(s.slice(-1));
return (lastDigit % 2) === 0;
}
function isDivisibleBy3(s) {
var digits = s.split("")
.map(Number);
var sum = digits.reduce(function(a, b) {
return a + b
});
return (sum % 3) === 0;
}
console.log(isDivisibleBy6("29070521868839257"));
console.log(isDivisibleBy6("29070521868839256"));
这些甚至可以根据这些规则的本质进行递归定义:
function isDivisibleBy6(s) {
return isDivisibleBy2(s) && isDivisibleBy3(s);
};
function isDivisibleBy2(s) {
if (s.length === 0) {
return false;
}
if (s.length > 1) {
return isDivisibleBy2(s.slice(-1));
}
var lastDigit = Number(s);
return (lastDigit % 2) === 0;
}
function isDivisibleBy3(s) {
if (s.length === 0) {
return false;
}
if (s.length > 1) {
var digits = s.split("")
.map(Number);
var sum = digits.reduce(function(a, b) {
return a + b
});
return isDivisibleBy3(String(sum));
}
var num = Number(s);
return (num % 3) === 0;
}
console.log(isDivisibleBy6("29070521868839257"));
console.log(isDivisibleBy6("29070521868839256"));
这纯粹是为了演示除法规则以及如何将它们应用于字符串。您必须创建可被 6
整除的数字为此,您必须替换星号。最简单的方法就像你所做的那样 - 生成所有可能性(例如, 1*0
将是 100
、 110
、 120
、 130
、 140
、 150
、 160
, 170
、 180
、 190
),然后过滤掉不能被 6
整除的内容:
function isDivisibleBy6(s) {
var allDigits = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];
var allPossibleNumbers = allDigits.map(function(digit) {
return s.replace("*", digit);
});
var numbersDibisibleBySix = allPossibleNumbers.filter(function(s) {
return isDivisibleBy2(s) && isDivisibleBy3(s);
})
return numbersDibisibleBySix;
};
function isDivisibleBy2(s) {
var lastDigit = Number(s.slice(-1));
return (lastDigit % 2) === 0;
}
function isDivisibleBy3(s) {
var digits = s.split("")
.map(Number);
var sum = digits.reduce(function(a, b) {
return a + b
});
return (sum % 3) === 0;
}
console.log(isDivisibleBy6("29070521868839*57"));
console.log(isDivisibleBy6("29070521868839*56"));
最后一点,可以通过删除中间值并使用箭头函数来编写更简洁的代码:
function isDivisibleBy6(s) {
return [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
.map(digit => s.replace("*", digit))
.filter(s => isDivisibleBy2(s) && isDivisibleBy3(s));
};
const isDivisibleBy2 = s => Number(s.slice(-1)) % 2 === 0;
const isDivisibleBy3 = s => s.split("")
.map(Number)
.reduce((a, b) => a + b) % 3 === 0
console.log(isDivisibleBy6("29070521868839*57"));
console.log(isDivisibleBy6("29070521868839*56"));
关于javascript - 使用 Javascript 的 Codewars 除法 Kata 生成的结果不能被 6 整除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58588389/
我大约 2 周前才开始学习编码,遇到了以下问题。我最初将代码编写为双嵌套循环,但不出所料地超时了。我重新编译了我的代码,以便(我认为)具有 O(n) 的渐近运行时间而不是 O(n^2)。我正在寻找使我
问题如下:超市的自助收银台前排起了长队。您的任务是编写一个函数来计算所有客户结帐所需的总时间! 输入:客户:代表队列的正整数数组。每个整数代表一个客户,其值是他们结账所需的时间。n:正整数,收银台数量
我正在尝试解决 codewars 上的 6kyu 问题,并且偶然发现了一个恼人的错误,但我无法找到其根源。任务的快速解释:“给定两个数组 a 和 b 编写一个函数 comp(a, b) 来检查这两个数
所以我决定去 codewars 温习一下 java,我有这个问题需要解决: 给你一个包含整数的数组(长度至少为 3,但可能非常大)。该数组要么完全由奇数整数组成,要么完全由除单个整数 N 之外的偶数整
这个问题已经有答案了: Regex for password must contain at least eight characters, at least one number and both
CodeWars 问题: Create a function named divisors that takes an integer and returns anarray with all of
我被困在 Codewars Kata 中,我希望有人能帮助我(不要破坏解决方案)。事实上,问题是我没有完全理解它应该如何工作,我明白了练习的想法,但事情有点困惑,尤其是在示例测试中。 以下是说明: T
我被下面的任务卡住了,花了大约 3 个小时才弄明白。 任务描述:一个人有一辆值(value) 2000 美元的旧车。他看到一辆值(value) 8000 美元的二手车。他想保留他的旧车,直到他能买到二
关闭。这个问题是not reproducible or was caused by typos .它目前不接受答案。 这个问题是由于错别字或无法再重现的问题引起的。虽然类似的问题可能是on-topi
接下来的挑战是: At a job interview, you are challenged to write an algorithm to check if a given string, s,
问题来了: 新的《复仇者联盟》电影刚刚上映!电影院售票处人山人海,排起了长队。他们每个人都有一张 100、50 或 25 美元的钞票。 “复仇者联盟”门票 25 美元。 Vasya 目前是一名文员。他
问题是: "My friend John and I are members of the "Fat to Fit Club (FFC)". Johnis worried because each m
关闭。这个问题需要details or clarity .它目前不接受答案。 想改善这个问题吗?通过 editing this post 添加详细信息并澄清问题. 去年关闭。 Improve this
希望每个人都有美好的一天。 这是我在 Stackoverflow 上发表的第一篇文章! 我刚刚完成了 Codeacademy 上的 javascript 类(class),并且也阅读了几本相关书籍。现
This Codewars Challenge要求您 Choose exactly one element from the sequence and replace it with another
我正在解决以下代码 war 问题。问题如下所示: Instructions Write a function capitals that takes a single string (word) as
谁能找出这段代码有什么问题吗?我在 CodeWars 上运行代码并通过了除一个之外的所有测试...遗憾的是它没有显示该特定测试的输入内容,因此很难弄清楚。 以下是挑战说明: 新的《复仇者联盟》电影刚刚
关闭。这个问题需要多问focused 。目前不接受答案。 想要改进此问题吗?更新问题,使其仅关注一个问题 editing this post . 已关闭 6 年前。 Improve this ques
尝试解决this codewars challenge : Your job is to fix the parentheses so that all opening and closing par
简介 问题在 Link to challenge for best instructions 上有解释 据我所知,如果左侧的元素大于0。 即[2, -4, 6, -6] => [-6, -4, 6,
我是一名优秀的程序员,十分优秀!