几乎相同的代码,但答案非常不同

时间:2013-12-26 09:21:54

标签: javascript

我正在用JavaScript编写一个程序来计算6位数的数字,其前3位数的总和等于最后3位数的总和。所以我为这个问题写了两个不同的解决方案,尽管只有一个会回答正确的答案 我还编写了一个函数sumOfDigits(),它只是计算传递给它的数字的总和。此功能不在这里写,但它的工作正确。

<小时/>

function count1() {
    total=0;
    for (i = 100000; i <= 999999; i+=1) {
         part = i % 1000;
         if ((sumOfDigits(i-part)) == ((sumOfDigits(part)))) {
             total+=1;
         }
     } return total;
}

function count2() {
    array = [];
    for (i = 100000; i <= 999999; i+=1) {
        part = i % 1000;
        if ((sumOfDigits(i-part)) == ((sumOfDigits(part)))) {
            array.push(i);
        }
    } return array;
}

count1()函数无法正常工作并返回28作为答案,而返回数组的count2()函数返回长度为50412的数组,这是正确的答案。有人可以告诉我为什么第一个功能无法正常工作。
正在运行的count1功能的屏幕截图。 A screenshot of the count1() function in action.

3 个答案:

答案 0 :(得分:5)

您是否在total的实施中使用sumOfDigits()?我猜这两个函数都使用相同的全局total

首次使用时,您应该为所有局部变量添加前缀var,这样它们就不会被视为全局变量,例如:

var total = 0;

编辑:我刚刚确认了这一点。如果sumOfDigits()使用全局totalcount1()将返回28。

答案 1 :(得分:1)

可能total是一个全局变量,对您的解决方案有一些价值。尝试为return返回另一个变量:

 function count1() {
        var count = 0;
        for (i = 100000; i <= 999999; i+=1) {
             part = i % 1000;
             if ((sumOfDigits(i-part)) == ((sumOfDigits(part)))) {
                 count+=1;
             }
         } return count;
    }

答案 2 :(得分:0)

我认为您可以重新考虑您的代码。这是一种更简单,更快速的方法(在nodejs中<500ms,更快,因为它是所有数字,即没有转换):

//helper: sum of digits in number [n]
function sumOfDigits(n){
   if (!(n^0) || n<10) {return n;}
   var sum = 0;
   while (n>=10) {
     sum += n%10;
     n = (n/10)^0;
   }
   return sum+n;
}

function sumDigitsComparer(num){
  return  sumOfDigits((num/1000)^0) === sumOfDigits(num%1000);
}

var x = 1000000, n = 0;
while ((x-=1,x>=100000)) { sumDigitsComparer(x) && (n+=1); }
//=> n = 50412