2017-02-24 60 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

非常感謝! –