-3

+= 产生不同的结果,请参见下面的代码...带有 temp 的代码可以正常工作,而不是其他代码,您可以通过创建 java 应用程序来调试它。

public long JavaStopsAdding(int treeHeight) {

    long cars = 0;
    long cars1 = 0;
    int i = 0;
    while (treeHeight - i >= 0) {

        long temp = 0;

        if (treeHeight - i == 0 ) {
            cars += 1;
            cars1 += 1;
            break;
        }


       // working code start

           temp = (long) ((Math.pow(2,treeHeight- i))/2);
       cars1 += temp;
           System.out.print("temp " + (treeHeight- i) + " cars " + cars1 +"\n");
    // working code END

          // NON working code Start
            cars += ((Math.pow(2,treeHeight- i))/2);
    System.out.print("temp " + (treeHeight- i) + " cars " + cars + "\n");   
        // NON working code END
        i += 2;     
    }
    return cars;
}
4

3 回答 3

4

+= 很可能没有任何问题。相反,问题是您的价值正在溢出。

您不应该使用Math.pow(2, n),而是使用1L << n不仅更快而且更有可能工作。无论哪种方式,您都不能让 n > 62 并期望它起作用。

于 2013-07-19T20:52:55.493 回答
1

使用 BigInteger 作为导致其溢出的数学运算。

于 2013-07-19T21:14:45.450 回答
-1

我用 treeheight = 10 测试了代码,发现一切正常。您的代码包含两个变量 cars1 和 cars :

// working code start

temp = (long) ((Math.pow(2,treeHeight- i))/2);
cars1 += temp;
System.out.print("temp " + (treeHeight- i) + " cars " + cars1 +"\n");
// working code END

 // NON working code Start
        cars += ((Math.pow(2,treeHeight- i))/2);
System.out.print("temp " + (treeHeight- i) + " cars " + cars + "\n");   
    // NON working code END
于 2013-07-19T20:58:39.290 回答