将等式转化为代码

Turn equation into code

The number of zero digits in the range [m,n]

好的,所以我正在尝试将这个公式(在 link 提供的图片中)转换为 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; 

多个问题。这里有一些。

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 的增加而线性减慢。也许另一种试用方法是使用记忆。我会尝试另一种方法,然后 post 返回。

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