在数字的阶乘中查找尾随0

时间:2016-02-13 05:07:56

标签: c windows ubuntu

#include <stdio.h>

main() {
    int n;
    scanf("%d", &n);
    int zz, count;
    int i = 5;
    while(zz >= 1) {
        zz = n / i;
        count += zz;
        i = i * 5;
    }
    printf("%d", count);
}

这是用于在数字的阶乘中查找尾随0的代码。 它在Ubuntu中提供的输出不同于Windows。

4 个答案:

答案 0 :(得分:1)

通过在编译期间启用警告,您可以找到至少一些问题。在这种情况下(clang -Wall -Wextra the_file.c的输出):

tst.c:3:1: warning: type specifier missing, defaults to 'int' [-Wimplicit-int]
main() {
^
tst.c:10:9: warning: variable 'count' is uninitialized when used here [-Wuninitialized]
        count += zz;
        ^~~~~
tst.c:6:18: note: initialize the variable 'count' to silence this warning
    int zz, count;
                 ^
                  = 0
tst.c:6:9: warning: variable 'zz' is used uninitialized whenever function 'main' is called [-Wsometimes-uninitialized]
    int zz, count;
    ~~~~^~
tst.c:8:11: note: uninitialized use occurs here
    while(zz >= 1) {
          ^~
tst.c:6:11: note: initialize the variable 'zz' to silence this warning
    int zz, count;
          ^
           = 0
3 warnings generated.

你应该先解决所有这些问题。

答案 1 :(得分:0)

我不确定您究竟在问什么,但我可以指出您的代码存在一些问题:

  1. 缩进代码。缩进代码是强制性的。
  2. 尝试在运算符周围添加空格。它使您的代码更具可读性。
  3. 不要使用scanf。如果你避开整个scanf系列函数,你会更开心。
  4. 您正在使用zzcount而未初始化它们。 C不会将变量初始化为任何特定值;你必须自己初始化它们。
  5. 您应该将main更改为int main。他们做同样的事情,但后者更容易阅读。
  6. 如果你添加一些测试用例来解释你的代码应该做什么,那么回答你的问题会更容易。

答案 2 :(得分:0)

未初始化的变量

int zz, count;
int i = 5;
while(zz >= 1) {  // what is zz?

i = i * 5;溢出。未定义的行为。不同系统的不同结果并不出人意料。

-

无需计算阶乘。只需计算5n的数量。

#include <stdio.h>
int main(void) {
  int n;
  scanf("%d", &n);
  printf("%d", n/5);
}

15! --> 1307674368000
9! --> 362880

要尾随0,事实需要5的倍数和2的倍数的乘积。因子组合中的每个其他数字是偶数,每5是5的倍数。

答案 3 :(得分:0)

     public static void main(String[] args) {
        int n=23;
        String fact= factorial(BigInteger.valueOf(23)).toString();
        System.out.format("Factorial value of %d is %s\n", n,fact);
        int len=fact.length();
        //Check end with zeros
        if(fact.matches(".*0*$")){
            String[] su=fact.split("0*$");
            //Split the pattern from whole string
            System.out.println(Arrays.toString(fact.split("0*$")));
           //Subtract from the total length 
            System.out.println("Count of trailing zeros "+(len-su[0].length()));
         }

    } 

     public static BigInteger factorial(BigInteger n) {
        if (n.equals(BigInteger.ONE) || n.equals(BigInteger.ZERO)) {
            return BigInteger.ONE;
        }
        return n.multiply(factorial(n.subtract(BigInteger.ONE)));


      }