我需要找到给定数字的尾随零。
对于较小的输入,它工作正常,但对于较长的输入,它不能完美地工作。
long input=s.nextInt();
long mul=1;
int count=0;
while(input!=1 && input<1000000000)
{
log.debug("mul="+mul+"Input="+input+"count="+count);
mul =mul*input;
input--;
while(mul%10==0)
{
count++;
mul=mul/10;
}
mul=mul%100;
//if()
}
System.out.println(count);
log.debug(count);
count=0;
输入
6//Working Correct
3//Working Correct
60//Working Correct
100//Working Correct
1024//Working Correct
23456//Working Wrong
8735373//Working Wrong
预期产出:
0
14
24
253
5861//My output is 5858
2183837//My output is 2182992
答案 0 :(得分:2)
由于您的号码截断为mod 100,您正在丢失零。 125将添加3个零。 625添加4. 3125添加5。 但是在修剪零之后你只保留2位数。 (它适用于100和1024是一致的。)
但是,当25或更大的5的幂进入时,由于截断100s数字,8的倍数可能会变为2的倍数,因此可能会丢失几个零。
不是做mul = mul%100,而是根据数字本身保留更多数字。
多少?与数字的最高功率相同。
答案 1 :(得分:1)
首先,我非常喜欢提问者和回答者提供的解决方案。但这并没有回答你的代码有什么问题。
我花了一段时间才弄明白,但我认为你所做的一个非常微妙的数学假设实际上并不成立。您的假设是您可以在每次迭代时减少模数100并且不会丢失任何内容。这种假设被证明是错误的。
减少模100在某些情况下不起作用。 100 = 5 ^ 2 * 2 ^ 2。问题是你失去了5s和2s,这可能最终导致更多的0,这意味着你的程序提供的答案可能少于真正的答案。
例如,如果在某个迭代中结果是125,那么在减少模100后,你得到25.如果在下一次迭代中你乘以72这样的数,那么结果将是(25 * 72)=在您的程序中1800,这意味着2个零。现在退一步看看如果将125乘以72得到的结果:(125 * 72)= 9000.这是3个零。所以你的程序错过了第3个零,因为减少模数100将数字125 = 5 ^ 3变成25 = 5 ^ 2(即它丢失了5的倍数)。
如果你不遵循数学论证,那么你可以做些什么来看到我是对的证据:将你的mod减少100改为mod减少1000.我敢打赌它接近正确的答案。只要你小心溢出,你甚至可以尝试10000更接近。
但最终,这种解决方案方法存在缺陷,因为对于足够高的数字,模数减少将会丢失5s和2s的倍数。结论:使用像提问者和回答者这样的方法,但要确保你能证明它有效! (他已经为你勾勒出了证据!)
答案 2 :(得分:-1)
而不是实际计算答案,这将花费太长时间并可能溢出整数,只需检查数字中的5的数量。
这是有效的,因为尾随零的数量由5的数量决定。在因子数中,总有2个因子的因子多于5个因子。数量中5个因子的数量是尾随零的数量。
int answer = 0;
for (int i = 5; i <= input; i+=5) { //i starts at 5 because we do not count 0
answer++;
}