我想计算从0开始的 N 范围内的零个数。
如果 N 100 表示,则范围应从 0到100 开始,然后计数应为 12
下面的代码可以使用 10 ^ 6
private static int calcZeros(String input){
int count = 0;
int n = Integer.parseInt(input);
for(int i = 0;i<=n;i++){
count += String.valueOf(i).replaceAll("[a-zA-Z_1-9]","").trim().length();
}
return count;
}
如果 N 超过 10 ^ 6 ,它就会挂起,很明显,循环运行的时间很长。
我的问题是,这是找到零计数的正确方法吗?
建议我做一些最快的计算方法。
答案 0 :(得分:1)
这是(半)组合问题。
例如想象4位数字:
我们开始找到一个零的所有数字。
在第一个位置(从左到右),您可以使用1-9,然后是1-9,然后是1-9的数字,然后会有0,所以没有其他选项。
其9 * 9 * 9的可能性。
零点可以分三个位置。
然后我们必须找到所有带有两个零的4位数字。
我们可以使用二项式系数,在我们的情况下,(n k)
将是n=number of digits - 1
,k = number of zeroes
,然后将它乘以9 * 9,因为这是其他数字的所有可能性。< / p>
我现在必须走了,所以我不能为任何可能的数字完成它,但是对于给定的位数,这个应该是有效的:
public static void main(String[] args) {
System.out.println(numberZeroes(2));
}
public static int numberZeroes(int digits) {
int result = 0;
for (int i = 1; i <= digits - 1; i++) {
result += binomial(digits - 1, i) * Math.pow(9, digits - i);
}
return result+1;
}
public static int binomial(final int N, final int K) {
BigInteger ret = BigInteger.ONE;
for (int k = 0; k < K; k++) {
ret = ret.multiply(BigInteger.valueOf(N - k))
.divide(BigInteger.valueOf(k + 1));
}
return ret.intValue();
}
答案 1 :(得分:0)
不是使用字符串和正则表达式,而是将速度除以10会快得多 - 例如:
int i = 96;
int firstDigit = i / 10;
int secondDigit = i - firstDigit * 10;
对于任意大数字,您只需要用while循环替换它。
答案 2 :(得分:0)
此算法在20秒内计算零到1000000000的零数。我希望它有所帮助。
int count = 0;
int n = 1000000000;
for (int i = 0; i <= n; i++) {
int m= i;
do {
if (m % 10 == 0)
++count;
m = m / 10;
} while (m > 0);
}
System.out.println("count = " + count);
答案 3 :(得分:0)
试试这个
int n = 1000000;
int count = 0 ;
Pattern pattern = Pattern.compile("0+");
for(int i = 0; i <= n ; i++ ) {
Matcher m = pattern.matcher(String.valueOf(i));
while (m.find()) {
count += m.group().length();
}
}
System.out.println(count);