我正在写一种计算给定数字阶乘中尾随零的数量的方法。
例如:
6! = 720-> 1后退零
12! = 479001600-> 2个尾随零
这是我的代码
import java.math.BigInteger;
public class TrailingZeros
{
public static void main(String[] args)
{
int n = 12;
System.out.println(solution(n));
}
public static int solution(int n)
{
// computing factorial
BigInteger result = BigInteger.ONE;
for (int i = 1; i <= n; i++)
{
result = result.multiply(new BigInteger(i + ""));
}
String str = String.valueOf(result);
int count = 0;
char[] chars = str.toCharArray();
// counting numbers of trailing zeros
for (int i = chars.length - 1; i >= 0; i--)
{
if (chars[i] != '0')
break;
count++;
}
return count;
}
}
工作正常。但是我认为这不是一种有效的算法。请帮忙,谢谢。
答案 0 :(得分:4)
我认为您当前的方法本身没有任何问题。但是我们实际上可以使用单线来计算尾随零,将原始数字字符串的长度与去除尾随零的数字的长度进行比较:
String input = "479001600";
int numZeroes = input.length() - input.replaceAll("0+$", "").length();
System.out.println(numZeroes);
2
答案 1 :(得分:1)
即使数字为long
,下面的内容仍然有效;
String string = "479001600";
int counter = 0;
while (counter < string.length() && string.charAt(string.length() - 1 - counter) == '0') {
counter++;
}
System.out.println(counter);
// Output will 2
答案 2 :(得分:1)
您只需要知道因子10在n阶乘中的时间。 10是两个质数的因数:2和5,因此10乘以的次数是2和5出现的最小次数。
怎么样?
public static int solution(int n)
{
int twos = 0;
int fives = 0;
for (int i = 1; i <= n; i++)
{
twos += countFactors(i, 2);
fives += countFactors(i, 5);
}
return Math.min(twos, fives);
}
static int countFactors(int n, int fac) {
int count = 0;
while (n >= fac && (n%fac) == 0) {
n /= fac;
++count;
}
return count;
}
更新:
正如@ david-conrad指出的那样,二位数比五进制要频繁得多,因此我们只需要计算五位数即可:
public static int solution(int n)
{
int fives = 0;
for (int i = 1; i <= n; i++)
{
fives += countFactors(i, 5);
}
return fives;
}
static int countFactors(int n, int fac) {
int count = 0;
while (n >= fac && (n%fac) == 0) {
n /= fac;
++count;
}
return count;
}
更新2:这是一个演示:http://rextester.com/DWIO77242