使用Javascript的Codewars division Kata正在生成不可被6整除的结果

使用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++)

我试图从Codewars中解决这个Kata:

其思想是将一个数字(表示为字符串)替换为*,例如“1047*66”,然后插入到函数中。您必须返回一个数组,其中的值是原始数字,用*替换为将产生一个被6整除的数字。因此,给定“1*0”,正确的结果数组应该是[120150180]

我有一些代码产生了一些正确的结果,但对其他代码有错误,我不知道为什么。代码如下:

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);
};