创联ifLab的招新问答卷上看到这么一题

核心问题是:

求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整除的有 5 10 15 20 25 30 35 40 45 50 共10个,即50/5=10

但别忘了25和50,他们可拆分成5*5和5*5*2,也就是说能被5^2整除的数会带来2个零(以此类推5的m次方会在末尾带来m个零)。

所以50!末尾有10+2=12个“0”。

所以额外还要求出这5的m次方的数的个数,我们可以从5到5*5到5*5*5 ... 慢慢往大的找。

那么具体代码如下(借鉴于网络,2L的答案)

 int totalzero(int n)
{
int total = ;
while (n > )
{
n = (n - (n % )) / ;
total += n;
}
return total;
}

这里的第n次循环相当于求能被5^n整除的数有多少,并把结果相加。

虽然每次循环后n的数值变了,但整体效果还是相当于在求能被5^n整除的数有多少。

那么回答一下图中的问题:

1,为什么N不同结果却相同:看代码很明显,末尾数字是01234或者56789的时候结果都是一样的,因为经过了一次 n - (n % 5) 末尾全都变成0了,接下来的运算都相同,必然得出相同的结果。

2,具体产生编号的思路:

 #include <stdio.h>
#include <string.h> int totalzero(int n)
{
int total = ;
while (n > )
{
n = (n - (n % )) / ;
total += n;
}
return total;
} int main()
{
char Sequence[] = { };
memset(Sequence, '', );
sprintf(Sequence,"%08d",totalzero());
printf("%s\n", Sequence); return ;
}

N的阶乘末尾有多少个零?的更多相关文章

  1. N!末尾有多少个零

    题目一:210!最后结果有几个零. 请自己思索10分钟以上再看解释 凡是这种题目必有规律可言, 关键是你找到这个规律的恒心.可采用笨拙的方法思考. 1!  =  1                   ...

  2. N的阶乘末尾有多少个0

    N的阶乘(N!)中的末尾有多少个0? N的阶乘可以分解为: 2的X次方,3的Y次方,4的5次Z方,.....的成绩.由于10 = 2 * 5,所以M只能和X和Z有关,每一对2和5相乘就可以得到一个10 ...

  3. CSU 1021 从m个不同元素中取出n (n ≤ m)个元素的所有组合的个数,叫做从m个不同元素中取出n个元素的组合数。组合数的计算公式如下: C(m, n) = m!/((m - n)!n!) 现在请问,如果将组合数C(m, n)写成二进制数,请问转这个二进制数末尾有多少个零。

    题目链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=82974#problem/B 解题思路:这个题目就是求因子的个数, m!/((m ...

  4. N!中末尾有多少个0

    问题:先从100!的末尾有多少零         =>    再推广到  任意N!的末尾有多少个零 分析:首先想到慢慢求解出100!或N!,但计算机表示数有限,且要防止溢出. 则从数学上分析:一 ...

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

    题目描述: 输入一个正整数n,求n!(即阶乘)末尾有多少个0? 比如: n = 10; n! = 3628800,所以答案为2 输入描述: 输入为一行,n(1 ≤ n ≤ 1000) 输出描述: 输出 ...

  6. ACM_数论_阶乘N!的末尾有几个零 和 末尾有多少个 1 nyoj 954

    原文地址 首先阶乘的一个常识要知道就是25!的末尾6位全是0: 前言: <编程之美>这本书,爱不释手! 问题描述: 给定一个整数N,那么N的阶乘N!末尾有多少个0呢?例如:N=10,N!= ...

  7. 哪几个数的阶乘末尾有n个零?

    题目:哪几个数的阶乘末尾有n个0?其中n是一个正整数,从键盘输入. int main( void ) /* name: zerotail.cpp */ { int num, n, c, m; cout ...

  8. [LeetCode] Factorial Trailing Zeroes 求阶乘末尾零的个数

    Given an integer n, return the number of trailing zeroes in n!. Note: Your solution should be in log ...

  9. [LeetCode] 172. Factorial Trailing Zeroes 求阶乘末尾零的个数

    Given an integer n, return the number of trailing zeroes in n!. Example 1: Input: 3 Output: 0 Explan ...

随机推荐

  1. F - Experienced Endeavour 矩阵快速幂

    Alice is given a list of integers by Bob and is asked to generate a new list where each element in t ...

  2. 24、Java并发性和多线程-信号量

    以下内容转自http://ifeve.com/semaphore/: Semaphore(信号量) 是一个线程同步结构,用于在线程间传递信号,以避免出现信号丢失(译者注:下文会具体介绍),或者像锁一样 ...

  3. KonBoot – 只要5K映象文件轻易绕过您的WindowsXP/VISTA/7系统的密码

    http://pannisec.diandian.com/?tag=konBoot 这个东西是我昨晚点击了QQ弹窗的那个SOSO问题后,有人问我如何破解Windows登陆密码,且不可以用net命令创建 ...

  4. iOS: 学习笔记, Swift操作符定义

    Swift操作符能够自行定义, 仅仅须要加上简单的标志符就可以. @infix 中置运算. 如+,-,*,/运算 @prefix 前置运算. 如- @postfix 后置运算. a++, a-- @a ...

  5. apple air装双系统(win7)

     同事买了一个apple air.用不习惯,希望再装个win7,经过多次试验,得到例如以下操作方法: 1.在MAC系统里的"有用工具"中找到"Boot Camp 助理 ...

  6. 线段树+离散化 IP地址段检查 SEGMENT TREE

    Problem: Give a series of IP segments, for example, [0.0.0.1-0.0.0.3], [123.234.232.21-123.245.21.1] ...

  7. 完美解决EditText和ScrollView的滚动冲突(上)

    在网上搜了一下EditText和ScrollView的滚动冲突,发现差点儿全部的解决方式都是触摸EditText的时候就将事件交由EditText处理,否则才将事件交由ScrollView处理.这样确 ...

  8. LeetCode 141. Linked List Cycle (链表循环)

    Given a linked list, determine if it has a cycle in it. Follow up:Can you solve it without using ext ...

  9. 使用VS2005安装和编译QT4.53源码

    学习Qt,当然是QT4好.可是装了4.86以后,网上下载的书中的例子大多无法直接用VS执行(个人不喜欢用QT Creator),即打开pro转换的时候出错(我也懒的研究为什么出错了).看了一下发布时间 ...

  10. oc83--自定义类实现copy方法

    // // main.m // 自定义类实现copy #import <Foundation/Foundation.h> #import "Person.h" #imp ...