在因子中找到尾随零

时间:2016-02-25 21:07:41

标签: java math

我需要找到给定数字的尾随零。

对于较小的输入,它工作正常,但对于较长的输入,它不能完美地工作。

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

3 个答案:

答案 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++;
}