2017-02-24 55 views
0

The number of zero digits in the range [m,n]打开公式为代码

好了,所以我试图把这个公式(在提供链接的图片)成Java代码,我有话开始,但我不知道,我正确地做到了。有人看到它有什么问题吗?(变量很长,因为我会在等式中插入非常大的数字)

long loop1 = 0, loop2 = 0; 
    // put in a loop 

    for (int k = 1; k < n; k++) { 
     for (int i = 0; i < Math.log10(k); i++) { 
      loop1 += (1 - ((((k/Math.pow(10, i)) - (10 * (k/Math.pow(10, i + 1)))))/10)); 
     } 

    } 
    for (int k = 1; k < m - 1; k++) { 
     for (int i = 0; i < Math.log10(k); i++) { 
      loop2 += (1 - ((((k/Math.pow(10, i)) - (10 * (k/Math.pow(10, i + 1)))))/10)); 
     } 

    } 

    answer = loop1 - loop2; 
+2

你有一个具体的问题,或者是你要求一个[codereview.se] – shmosel

+0

这对我来说看起来不错,至少从一眼就可以看出来。如果你有一些已知的输入和输出,你可以尝试对此进行测试。 –

+0

我只是在寻找一个代码审查,抱歉,如果它变得怪异。我确实有一些知道的输入。例如m = 100 n = 200.它应该输出22而不是我得到301 –

回答

1

多个问题。这里有一些。

for (int k = 1; k < n; k++) { // SHOULD BE k <= n. 
    for (int i = 0; i < Math.log10(k); i++) { // AGAIN USE <= 
     // USE CEILING AND FLOOR FUNCTIONS NOT POWER. USE DOUBLE PRECISION NOT INTEGER. 
     loop1 += (1 - ((((k/Math.pow(10, i)) - (10 * (k/Math.pow(10, i + 1)))))/10)); 
    } 

} 

似乎是一个有趣的问题来解决。这是我使用mod和除法运算符的意思。但是随着n的增加,它会线性减慢。也许另一种尝试的方法是使用记忆。我会尝试另一种方法并回传。

public class ZeroCount { 
    public static void main(String[] args) { 

     long start = Long.parseLong(args[0]); 
     long end = Long.parseLong(args[1]); 
     System.out.println("Number of zeros encountered from [" + start + "] to [" + end + "] : " +getZeroCount(start, end)); 

    } 

    public static long getZeroCount(long begin, long end) { 
     long zeroCount = 0; 
     for (long curNum = begin; curNum <= end; curNum++) { 
      if (curNum == 0) { 
       zeroCount++; 
       continue; 
      }  
      long tempNum = curNum; 
      while (tempNum/10.0 > 0) { 
       if (tempNum % 10 == 0) { 
        zeroCount++;  
       }   
       tempNum /= 10; 
      }  
     } 
     return zeroCount; 

    } 
} 

结果:

jeetatl$ time java ZeroCount 0 100 
Number of zeros encountered from [0] to [100] : 12 

real 0m0.066s 
user 0m0.049s 
sys  0m0.014s 
jeetatl$ time java ZeroCount 0 1000 
Number of zeros encountered from [0] to [1000] : 193 

real 0m0.070s 
user 0m0.051s 
sys  0m0.015s 
jeetatl$ time java ZeroCount 0 10000 
Number of zeros encountered from [0] to [10000] : 2894 

real 0m0.091s 
user 0m0.061s 
sys  0m0.015s 
jeetatl$ time java ZeroCount 0 100000 
Number of zeros encountered from [0] to [100000] : 38895 

real 0m0.076s 
user 0m0.059s 
sys  0m0.015s 
jeetatl$ time java ZeroCount 0 1000000 
Number of zeros encountered from [0] to [1000000] : 488896 

real 0m0.130s 
user 0m0.114s 
sys  0m0.015s 
jeetatl$ time java ZeroCount 0 10000000 
Number of zeros encountered from [0] to [10000000] : 5888897 

real 0m0.606s 
user 0m0.592s 
sys  0m0.015s 
jeetatl$ time java ZeroCount 0 100000000 
Number of zeros encountered from [0] to [100000000] : 68888898 

real 0m6.756s 
user 0m6.728s 
sys  0m0.024s 
jeetatl$ time java ZeroCount 0 1000000000 
Number of zeros encountered from [0] to [1000000000] : 788888899 

real 1m8.226s 
user 1m8.191s 
sys  0m0.041s 
+0

为什么我会用天花板和地板代替电源? –

+0

看这个链接的地板和天花板的符号。我在您发布的图片中看到相同的数学符号。 https://en.wikipedia.org/wiki/Floor_and_ceiling_functions#Notation – Ali

+0

非常感谢! –