对一个正整数n,求出n!中末尾0的个数。

对一个正整数n,求出n!中末尾0的个数。

输入

输入有若干行。每一行上有一个整数T,是测试数据组数,接着有T行,每一行包含一个确定的正整数n(n≤1000000000)。

输出

对输入行中的每一个数据n,输出一行,其内容是n!中末尾0的个数。

输入样例                              输出样例

3                                     

3                                     0

100                                   24

1024                                  253      

 

下边的代码只是解法的核心部分。   

 

#include <stdio.h>
void main()
{
__int64 n,i,t,two=0,five=0,sum;
scanf("%I64d",&n);
for (i=1;i<=n;i++)
{
t=i;
while (t%2==0 && t!=1)
{
two++;
t/=2;
}
t=i;
while (t%5==0 && t!=1)
{
five++;
t/=5;
}
}
sum = (two>five?five:two);
printf("%I64d\n",sum);
}

 //今天看了《编程之美》,原来代码可以如此简单。。。还有一种更快的解法、也很巧妙

#include <stdio.h>
void main()
{
    __int64 n,i,t,five=0;
    scanf("%I64d",&n);
    for (i=1;i<=n;i++)
    {
        t=i;
        while (t%5==0 && t!=1)
        {
            five++;
            t/=5;
        }
    }
    printf("%I64d\n",five);
}

 

转载于:https://www.cnblogs.com/CheeseZH/archive/2012/03/18/2405203.html

在C语言,计算大整数阶乘(n!)并统计"0"的个数以及末尾"0"的个数,可以采用长整型数组来存储间结果,并利用模运算判断是否含有5*2=10因子,因为一个因数5会产生一个末尾的0,而每个2都会产生另一个0(直到有剩余的5)。以下是简单的步骤: 1. 定义一个数组`factorial`用于存放阶乘的结果,初始化为1。 2. 使用循环从2到n遍历,每次将当前数乘以`factorial`并将结果存回数组。 3. 对于每个乘法操作,同时检查是否有足够多的2来配对5(即检查是否存在因子2的数量),并增加相应的计数。 4. 计算结束后的数组元素就是n!,然后遍历该数组计算实际末尾0的数量。 下面是示例代码: ```c #include <stdio.h> #include <math.h> // 函数声明 long long factorial(int n); int zeros_in_factorial(long long num); int main() { int n; printf("请输入一个1 <= n <= 10000 的正整数: "); scanf("%d", &n); // 计算阶乘 long long fact = factorial(n); // 输出阶乘及其末尾0的数量 printf("n! = %lld\n", fact); printf("n!数字0的个数: %d\n", zeros_in_factorial(fact)); return 0; } // 计算阶乘 long long factorial(int n) { long long fact = 1; for (int i = 2; i <= n; ++i) { fact *= i; } return fact; } // 统计末尾0的数量 int zeros_in_factorial(long long num) { int count = 0; while (num > 0) { num /= 10; // 移除末位 count += num >= 5; // 当num大于等于5时,说明之前存在足够的5配合2产生0 } return count; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值