使用Javascript的Codewars division Kata正在生成不可被6整除的结果
我试图从Codewars中解决这个Kata: 其思想是将一个数字(表示为字符串)替换为*,例如“1047*66”,然后插入到函数中。您必须返回一个数组,其中的值是原始数字,用*替换为将产生一个被6整除的数字。因此,给定“1*0”,正确的结果数组应该是[120150180] 我有一些代码产生了一些正确的结果,但对其他代码有错误,我不知道为什么。代码如下:使用Javascript的Codewars division Kata正在生成不可被6整除的结果,javascript,arrays,math,Javascript,Arrays,Math,我试图从Codewars中解决这个Kata: 其思想是将一个数字(表示为字符串)替换为*,例如“1047*66”,然后插入到函数中。您必须返回一个数组,其中的值是原始数字,用*替换为将产生一个被6整除的数字。因此,给定“1*0”,正确的结果数组应该是[120150180] 我有一些代码产生了一些正确的结果,但对其他代码有错误,我不知道为什么。代码如下: function isDivisibleBy6(s) { var results = []; for(i=0;i<10;i++)
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);
};
功能可由6(s)区分{
var结果=[];
对于(i=0;i而言,所有数字之和可被3整除,最后一个数字可被2整除
一种方法:
- 获取星星的索引
- 在星星的旁边放上左弦和右弦
- 如果最后一个数字不能被2整除,请提前返回
- 取所有数字之和
- 最后创建一个缺少数字的数组:
- 从零开始循环(sum没有三的余数),或者取三和余数的增量(因为您需要一个可以被三整除的数字)
- 当值小于10时继续
- 如果星号的索引是最后一个字符,则将该值增加3或6
- 取左、值和右部分,推送到结果集
- 返回结果
函数get6(s){
var index=s.indexOf('*'),
左=s.slice(0,索引),
右=s.slice(索引+1),
结果=[],
总和=0,
i、 步骤;
如果(s[s.长度-1]%2)返回[];
对于(i=0;i
.as控制台包装{max height:100%!important;top:0;}
所有数字之和可被三整除,最后一个数字可被二整除
一种方法:
- 获取星星的索引
- 在星星的旁边放上左弦和右弦
- 如果最后一个数字不能被2整除,请提前返回
- 取所有数字之和
- 最后创建一个缺少数字的数组:
- 从零开始循环(sum没有三的余数),或者取三和余数的增量(因为您需要一个可以被三整除的数字)
- 当值小于10时继续
- 如果星号的索引是最后一个字符,则将该值增加3或6
- 取左、值和右部分,推送到结果集
- 返回结果
函数get6(s){
var index=s.indexOf('*'),
左=s.slice(0,索引),
右=s.slice(索引+1),
结果=[],
总和=0,
i、 步骤;
如果(s[s.长度-1]%2)返回[];
对于(i=0;i
.as console wrapper{max height:100%!important;top:0;}
问题是这些数字大于-JavaScript数字在可靠性方面出现故障的点:
var num=29070521868839257;
console.log(num>Number.MAX\u SAFE\u INTEGER);
console.log(数量%6);
console.log(num)
问题在于,这些数字大于JavaScript数字在可靠性方面出现故障的时间点:
var num=29070521868839257;
console.log(num>Number.MAX\u SAFE\u INTEGER);
console.log(数量%6);
console.log(num)
问题在于:
parseInt(number, 10);
您可以检查并看到,当number
足够大时,由于以下原因,转换回字符串的结果不等于number
的原始值
无需将给定字符串转换为数字,即可解决此问题。相反,请使用6的倍数数字属性。它们是3的倍数,甚至是偶数。3的倍数具有数字总和(十进制表示)也是3的倍数的属性
因此,首先检查最后一个数字不是1、3、5、7或9,因为在这种情况下没有解决方案
否则,求出数字(忽略星号)。确定你需要加多少值,以得到3的倍数。这将是0, 1或2。如果星号不在最右边,用这个数字产生解,而3, 6, 9加上它(直到你得到两位数)。
如果星号在最右边,你也可以这样做,但是你必须确保你在那个位置不包括奇数。
如果你感到绝望,这里有一个解决办法。但我希望你能自己解决
功能可由6(s)区分{
//如果最后一个数字是奇数,它永远不能被6整除
如果(“13579”。包括(s[s.length-1]),返回[];
设[左,右]=s.split(“*”);
//计算数字总和(忽略星号)
设和=0;
对于(设为s的ch)和+=+ch
function isDivisibleBy6(s) {
var results = [];
for(i=0;i<10;i++) {
var string = i.toString();
var array = Array.from(s);
var index = array.indexOf("*");
array[index] = string;
var div2 = 0;
var div3 = 0;
if(parseInt((array[array.length-1]),10) % 2 == 0) {
div2 = 1;
}
var numarray = array.map((x) => parseInt(x));
if(numarray.reduce(function myFunc(acc, value) {return acc+value}) % 3 == 0) {
div3 = 1;
}
if(div2 == 1 && div3 == 1) {
results.push(array.join(""));
}
}
return(results);
};