100!的尾数有多少个零?100的阶层真的算不出来吗?

今天看到一个蛮有意思的题,是问“100!”的尾数有多少个零。

尾数有多少个零,实际上指的是从这个数的最后一个不为0的数的下一个(也就是0)开始计数,一直到最后一个数(这些数自然都是0)有多少个0。

好吧,也就是说13330330000的尾数有4个零……

一个整数若含有因子5,则必然在求解100!时产生一个0,也就是说我们从5开始for循环,每次循环都给加上5,然后计数器加1。同时如果该整数还能被25整除,计数器还应该再加上1。

因此代码如下:

#include<stdio.h>

int main()
{
    int a,count =0;
    for(a=5;a<=66;a+=5)
    {
        ++count;
        if(!(a%25))
            ++count;
    }
    printf("100!的尾数有%d个零。\n",count);
    return 0;
}

题目后面进一步问了如何求出任意N!的尾数有多少个零。

#include<stdio.h>

int main()
{
    int n;
    printf("请输入N:\n");
    scanf("%d",&n);
    if(n<0)
        printf("%d的阶层无意义。\n",n);
    else if(n<=4)
        printf("%d的阶层的尾数没有零。\n");
    else
    {
        int a,count =0;
        for(a=5;a<=n;a+=5)
        {
            ++count;
            if(!(a%25))
                ++count;
        }
        printf("100!的尾数有%d个零。\n",count);
    }
    return 0;
}

本文就这样结束了吗?

题目的解答中有这么一段话:先求出100!的值,然后数一下末尾有多少个零。事实上,由于计算机所能表示的整数范围有限,这是不可能的。

首先,什么叫计算机所能表示的整数范围?应该叫int等数据类型的整数范围有限才对,计算机嘛……撑死了只能说不能存储而非不能表示。

另外100的阶层真的求不出来吗?请往下读。

我的博客中有大量关于Lisp,或者说Scheme的博文,使用这个语言,几行代码就能搞定了不是吗?欢迎阅读我的其他博文……

(define (fact n)
  (if (= n 1)
      1
      (* n (fact (- n 1)))))
;Value: fact

1000的阶层也能求,截图为证……

闲得无聊,以下是10000的阶层,大家可以继续算更大的数,哈哈……

………………

我发现这个CSDN博客写上这么多数字之后博客没法提交,有异常……没办法,只能上传了……下载后觉得有意思记得回来点赞哦……

传送门:10000的阶层

时间: 2024-10-13 03:21:02

100!的尾数有多少个零?100的阶层真的算不出来吗?的相关文章

求一个n!中尾数有多少个零

题目描述: 输入一个正整数n,求n!(即阶乘)末尾有多少个0? 比如: n = 10; n! = 3628800,所以答案为2 输入描述: 输入为一行,n(1 ≤ n ≤ 1000) 输出描述: 输出一个整数,即题目所求 示例1 输入 10 输出 2 解题思路: 能被5(5^1)整除的提供1个0 能被25(5^2)整除的提供2个0 能被125(5^3)整除的提供3个0 能被625(5^4)整除的提供4个0 所以 结果= n/5 + n/25 + n/125 + n/625 #include<io

N的阶乘末尾有多少个零?

在创联ifLab的招新问答卷上看到这么一题,大意是: 给出一个整数N,求N!(N的阶乘)的末尾有多少个零? 由于在N特别大的时候强行算出N!是不可能的,所以肯定要另找方法解决了. 首先,为什么末尾会有0?因为2*5 = 10,0就这么来了.所以只要求出这N!中有多少个2多少个5相乘就好了,由于2的出现次数肯定是大于5的,所以只要求有多少个5相乘就好了. 因为求的是N的阶乘,而 N! = 1*2*3*....*N 那么:这N个数中能被5整除的个数 = N / 5 比如N = 50 ,能被5整除的有

n的阶乘结果中一共有多少个零?

题目:n的阶乘中一共有多少个零? 解答:产生零的结果只能有一种可能性那就是2*5=10,然而n的阶乘本质上是可以拆解为很多2和5以及其他不包含2和5的乘数的积,例如5的阶乘:1*2*3*4*5=1*2*3*2*2*5.按照这个思路,将n的阶乘乘积的每一项进行拆解,看看可以拆解出多少个2和多少个5,然后取2的个数和5的个数中最小的即可.程序代码如下: #include <stdio.h> int compute_zero(int n) { int five_count = 0; int two_

数独100*100的第一个结果 sudoku100*100

数独100*100的第一个结果  sudoku100*100 数独100*100是能够实现的,下面是第一个结果 版权声明:本文为博主原创文章,未经博主允许不得转载.

将100和灯泡编成100个号,即:1……100,现在有100个人去拉开关,第一个人把1的倍数的灯号开关都拉一下,第2个人把2的倍数的灯号都拉一下,直到第100人将100号灯泡拉一下.假定开始时,灯泡全不亮,请问这100人全拉完后,哪些编号的灯泡是亮的?请用编程证明你的方法

想到之前面试的一道题目,解决这个题,就是看到 其约数为基数个时就是亮的.用JS去实现也很简单,两个for循环可以了.个人的解答方法如下 let lightArr = [] // 先循环一遍1到100 for (let index = 1; index <= 100; index++) { let arr = [] for (let j = 1; j <= index; j++) { // 如果index % j等于0则表示j是其index的约数就是往arr里面添加 if (index % j

python计算1~100的和,1~100奇数的和,1~100偶数的和,一条代码求1~100的和

1.计算1~100的数之和----for循环实现1~100的和 sum1 = 0 for i in range(1,101): sum1 = sum1 + i i += 1 print(f"1-100之间的和是:{sum1}") ----while实现1~100的和 sum1 = 0 i = 1 while True: sum1 = sum1 + i if i == 100: break i += 1 print(sum1) 2.计算1~100里面偶数之和 sum1 = 0 for i

求N!尾数有多少个0

方法一:直接求因子5的个数. 1 #include<bits/stdc++.h> 2 using namespace std; 3 int main(){ 4 int n,cnt,tmp; 5 while(cin>>n){ 6 cnt=0; 7 for(int i=5;i<=n;i+=5){ 8 tmp=i; 9 while(tmp%5==0)cnt++,tmp/=5;//累加因子5的个数 10 } 11 cout<<cnt<<endl; 12 } 1

CCF(除法):线段树区间修改(50分)+线段树点修改(100分)+线段树(100分)

除法 201709-5 这道题有很多种方法来做,最常用的就是线段树和树状数组. 如果使用线段树来做,就会想到区间修改的update函数.但是这里可能会涉及到v是1或者a[j]是0的情况,所以用这种方法会超时,最多50分. 可以修改一下代码,使用点修改来做这道题.在main函数里面增加一个循环,用来判断. 当然,还有一种方法就是树状数组,这种方法和上面这种方法运行时间相差无几,但是代码量大大减少. 需要注意的是,如果v是long long型,最好不要用scanf %lld的方式读入,否则超时. 使

LeetCode 172 Factorial Trailing Zeroes(阶乘后的零)(*)

翻译 给定一个整型n,返回n!后面的零的个数. 注意:你的解决方案应该在log时间复杂度内. 原文 Given an integer n, return the number of trailing zeroes in n!. Note: Your solution should be in logarithmic time complexity. 分析 起初我看题目的时候没太注意,还以为就是求n这个数后面的零而已,虽然心想不会这么简单吧--就写了一份代码提交了,结果WA提示我5的话应该返回1,