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<=100;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的阶层

有网友私信问我,为什么一个整数若含有因子5,则必然在求解100!时产生一个0。这里所说的一个整数,自然是在求100的阶层时需要计算的从1到100这些整数。我下列出一些等式:

1x2=2
2x3=6
6x4=24
24x5=120

120x6=720
720x7=5040
5040x8=40320
40320x9=362880
362880x10=3628800

3628800x11=39916800
3991680x12=479001600
47900160x13=6227020800
622702080x14=87178291200
8717829120x15=1307674368000
…… ……

看到上式就会发现每次尾部增加0都是因为成了一个因子是5的整数。那么一直乘到100都会是这样吗?当然是。但这样就能证明?显然不能。

我们来看看各个整数的最后一个数:

如果是0的话,也就是说是乘以10或者20、30之类的,那么肯定会加上一个0。而且它也是5的倍数。

如果是1的话,无论乘以谁显然都不可能得到10。(这里的谁是指的的上面那些式子中的乘号左边的数的最后一个不为0的数。

如果是2的话,乘以5会得到10。

如果是4、6、8的话乘以5也会得到10。

如果是3、7、9的话就和1一样不会得到10。(得不到10也就无法增加一个0)

那么为什么是5而不是2、4、6、8呢?因为对于任何一个大于1的数的阶层而言,它的最后一个不为0的数必然是偶数。这又是为什么呢?因为最起码一开始就成了2,结果变成了偶数,而偶数乘以偶数为偶数,偶数乘奇数还是偶数…… 而2、4、6、8都必须和5相乘才可以得到10,以至于增加一个0。

那么5呢?5乘以任意一个偶数不都可以增加一个0吗,比如所10、20、30、40等等。

那么这个问题就得到了较为具体的解答。该网友还问了,为什么一个整数有25的因子,就需要计数再加1呢,很显然25是两个5的乘积呀。那么又为什么不考虑5的三次方也就是125呢?因为我们只乘到了100呀,100的阶层嘛。

如果不信我们就来验算一下呗……

#include<stdio.h>

int main()
{
    int a,count =0;
    for(a=5;a<=200;a+=5)
    {
        ++count;
        if(!(a%25))
        {
            ++count;
            if(!(a%125))
                ++count;
        }

    }
    printf("200!的尾数有%d个零。\n",count);
    return 0;
}

还有截图为证哦……

后来还看到一个题目,和这个也类似,需要求的是100的阶层的结果的数字中从左到右第一个四位的质数。

代码来源于网络以及别人的解答,感觉这里还是蛮巧妙地。

// C# Code
    public static class Program
    {
        public static void Main(string[] args)
        {
            string fac100 = Factorial(100).ToString("F0");
            Console.WriteLine("The factorial of 100 is : {0}", fac100);

            for (int i = 0; i <= fac100.Length - 4; i++)
            {
                string substr = fac100.Substring(i, 4);
                if (CheckPrime(Convert.ToInt32(substr)))
                {
                    Console.WriteLine("The expected result found and it is : " + substr);
                    return;
                }
            }
            Console.WriteLine("No result as expected!!");
        }

        public static double Factorial(int n)
        {
            double result = 1;
            for (int i = 1; i <= n; i++)
                result *= i;
            return result;
        }                   

        public static bool CheckPrime(int n)
        {
            if (n == 1 || n == 2)
                return true;
            int squareRoot = Convert.ToInt32(Math.Sqrt(n));
            for (int i = squareRoot; i > 1; i--)
                if (n % i == 0)
                    return false;
            return true;
        }
    }
// C++ Code
#include <iostream>
#include <math.h>
using namespace std;

double Factorial(int n)
{
    double result = 1;
    for (int i = 1; i <= n; i++)
        result *= i;
    return result;
}

bool CheckPrime(long n)
{
    if (n == 1 || n == 2)
        return true;
    long squareRoot = (long)sqrt(n);
    for (long i = squareRoot; i > 1; i--)
        if (n % i == 0)
        return false;
    return true;
}

int main(int argc, char *argv[])
{
    char buf[1024] = { '\0' };
    sprintf_s(buf, "%.f", Factorial(100));
    cout << "The factorial of 100 is : " << buf << endl;

    char substr[5] = { '\0' };
    for (int i = 0; i <= strlen(buf) - 4; i++)
    {
        memcpy(substr, buf + i, 4);
        if (CheckPrime(atol(substr)))
        {
            cout << "The expected result found and it is : " << substr << endl;
            return 0;
        }
    }
    cout << "No result as expected!!";
    return 0;
}
// C Code
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <stdbool.h>

double Factorial(int n)
{
    double result = 1;
    int i;
    for (i = 1; i <= n; i++)
        result *= i;
    return result;
}

bool CheckPrime(long n)
{
    if (n == 1 || n == 2)
        return true;
    long squareRoot = (long)sqrt(n);
    long i;
    for (i = squareRoot; i > 1; i--)
        if (n % i == 0)
        return false;
    return true;
}

int main(int argc, char *argv[])
{
    char buf[1024] = { '\0' };
    sprintf(buf, "%.f", Factorial(100));
    printf("The factorial of 100 is : %s\n",buf);

    char substr[5] = { '\0' };
    int i;
    for (i = 0; i <= strlen(buf) - 4; i++)
    {
        memcpy(substr, buf + i, 4);
        if (CheckPrime(atol(substr)))
        {
            printf("The expected result found and it is : %s\n",substr);
            return 0;
        }
    }
    printf("No result as expected!!\n");
    return 0;
}

欢迎大家点击左上角的“关注”或右上角的“收藏”方便以后阅读。



为使本文得到斧正和提问,转载请注明出处:
http://blog.csdn.net/nomasp

时间: 2024-09-20 09:00:47

100的阶层真的算不出来吗?的相关文章

&lt;font color=&quot;red&quot;&gt;[置顶]&lt;/font&gt;

Profile Introduction to Blog 您能看到这篇博客导读是我的荣幸,本博客会持续更新,感谢您的支持,欢迎您的关注与留言.博客有多个专栏,分别是关于 Windows App开发 . UWP(通用Windows平台)开发 . SICP习题解 和 Scheme语言学习 . 算法解析 与 LeetCode等题解 . Android应用开发 ,而最近会添加的文章将主要是算法和Android,不过其它内容也会继续完善. About the Author 独立 Windows App 和

Windows App开发之集成设置、帮助、搜索和共享

应用设置和应用帮助 "设置"合约 上一节中我们学习了如何将应用设置保存到本地,这种方式是通过在App内添加设置选项,这里还有一种方式.微软将其称为"设置"合约,并且所有的Windows应用商店应用都将自动配合这种合约.但是应用自带的这种设置如果不做任何修改可谓毫无作用.而我们添加这些设置则可以让应用更加个性化哦. SettingsFlyout 首先新建一个SettingsFlyout页面,也许很多童鞋会像我当初学这个一样立马就调试程序等着看看这个设置是长什么样,不过

【万里征程——Windows App开发】设置共享(共享源和共享目标)

上一篇博客简单介绍了通过粘贴板来共享数据,这一节将会添加更为强大的功能哦. 以下就是大概的样式了,随便看看就好了,这都不是重点. <Grid Background="AliceBlue"> <Grid.RowDefinitions> <RowDefinition Height="auto"/> <RowDefinition /> <RowDefinition Height="auto"/>

【万字总结】探讨递归与迭代的区别与联系及如何求解10000的阶层

递归和迭代 这两个概念也许很多童鞋依旧分不清楚,下面通过求解斐波那契数来看看它们俩的关系吧. 斐波那契数的定义: f0=0 f1=1 fi=fi−1+fi−2(i>1) 递归: (factorial 6) (* 6 (factorial 5)) (* 6 (* 5 (factorial 4))) (* 6 (* 5 (* 4 (factorial 3)))) (* 6 (* 5 (* 4 (* 3 (factorial 2))))) (* 6 (* 5 (* 4 (* 3 (2 (factori

世界500强:中企100排名第二

在<财富>世界500强榜单中,中国企业上榜数量从1996年的4家增加到现今的100家,这离不开中国经济的增长.但是在看到中国企业上榜数量上升的同时,也要看到上榜企业中,国企多民企少.重资产多轻资产少等特点.分析认为,中国企业因规模大而上榜,并不等于"伟大",更不等于是真正的世界企业.中国企业真正做到世界500强还有一段路要走. 在7月7日发布的2014年<财富>世界500强排行榜上,中国上榜企业数量首次达到100家,排名第二,仅次于美国的128家.中国石化还以4

工作五年“攒”够100万,程序猿们,我可没开玩笑!8条建议抱走不谢

对于身处北上广深杭等大多数一线城市来说,100万人民币并不算什么太大数字,甚至还不够给房子交首付,但是对于一个刚刚工作几年的程序员来说,拥有100万人民币存款却是一个看似难以实现的目标,然而只要作为程序员合的你们做好合理的规划,这个目标是不难实现的,而且当五年过去之后,你可能发现你不止拥有了这100万存款,还提升了自己的"财商".程序员如何实现工作五年"攒"够100万,本文就给你细细道来. 那么,作为一个程序员,工作五年就能如何才能够攒到100万呢? 其实,资金的积

微信公众平台开发(100) 2048游戏

  微信开发第100篇了,算上微信支付和微信小店,其实已经超过了,这次完整讲一下2048游戏吧. 一.2048游戏 <2048>是比较流行的一款数字游戏.原版2048首先在github上发布,原作者是Gabriele Cirulli.它是基于<1024>和<小3传奇>的玩法开发而成的新型数字游戏 .随后2048便出现各种版本,走各大平台.由Ketchapp公司移植到IOS的版本最为火热,现在约有1000万下载,其名字跟原版一模一样.衍生版中最出名的是<2048六边

口碑营销是个伪命题?是否真的适合互联网?

中介交易 http://www.aliyun.com/zixun/aggregation/6858.html">SEO诊断淘宝客 站长团购 云主机 技术大厅 作为最为奢侈的营销方式,口碑营销是否真的适合互联网? 当我们听到一位上学青年月入几十万,或者几个人组成的电商小团队就能完成年入百万业绩的时候,对互联网创业都抱着那么大那么大的憧憬与幻想,但是当你仔细打探.深究其里的是,你得到的信息是月入几十万的行当是他运营了一家小说站,年入百万是因为这团队玩竞价.做非法产品,你的互联网创业梦终于摇摇欲

第四批11家企业获IPO批文 全年上市新股不足100家

本周发审委将审核5家公司的首发申请. IPO批文正按照既定的计划有序下发.9月15日,证监会按法定程序核准了11家企业的首发申请,其中,上交所5家,深交所中小板1家.创业板5家.证监会要求,上述11家企业及其承销商将分别与沪深交易所协商确定发行日程,并陆续刊登http://www.aliyun.com/zixun/aggregation/4337.html">招股说明书. 这也是自今年6月份以来,证监会下发的第四批IPO批文.此前的6月9日.7月14日和8月19日,证监会分别核准了10家.