ACM_数论_阶乘N!的末尾有几个零 和 末尾有多少个 1 nyoj 954
首先阶乘的一个常识要知道就是25!的末尾6位全是0;
前言:
《编程之美》这本书,爱不释手!
问题描述:
- 给定一个整数N,那么N的阶乘N!末尾有多少个0呢?例如:N=10,N!=362800,N!的末尾有两个0;
- 求N!的二进制表示中最低位1的位置。
问题1的求解:
分析:
解法一:
首先,最直接的算法当然是直接求出来N!然后看末尾有几个0就行了。但这里存在两个问题:
(1)不管使用long或者double一定会产生溢出。
(2)效率低下。
对于问题(1),我们可以采用字符串存储的办法解决,但问题(2)是由本身算法决定的,所以只能采用其他的算法。
那
到底有没有更好的算法呢?我们来分析,N!能产生0的质数组合只能是2 *
5,也就是说当对N!进行质数分解之后,N!末尾0的个位M取决于2的个数X和5的个数Y的最小值,即M =
min(X,Y)。又因为能被2整除的数出现的频率比能被5整除的数高得多,且出现一个5的时,最少会同时出现一个2,所以M =
Y。即得出Y的值就可以得到N!末尾0的个数。
计算Y,最直接的方法,就是计算机1…N的因式分解中5的个数,然后求和。
代码如下:
static long GetZeroNum(long n)
{
long num = ;
int i,j;
for(i=; i<=n; i++)
{
j=i;
while(j % == )
{
num++;
j/=;
}
}
return num;
}
解法二:
那 么还有没有更简单点的方法呢?我们想,Y还能怎么样得到?举个例子 25的阶乘中,总共有6个五,其中5,10,15,20,各贡献一个,25贡献两个,也可以说成,5,10,15,20,25各贡献一个,25又额外贡献 一个,即5的倍数各贡献一个5,25的倍数各贡献一个5,即Y=[25/5] + [25/25]。同理,125中,5的倍数各贡献一个5,25的倍数各贡献一个5,125的倍数也各贡献一个5,所以Y=[125/5] + [125/25] + [125/125],所以可得公式:
Y = [N/5] + [N/52] + [N/53] + …
代码如下:
static long GetZeroNum(long n)
{
long num = ;
while(n != )
{
num=num+n/;
n=n/;
}
return num;
}
问题2的求解:
分析:
首先我们来分析一个二进制数乘以2和除以2的过程和结果是怎么样。
一个二进制数乘以2就是把将此二进制数向左移一位,末位补零。除以2时,则要判断末位是否为0,若为0,向右移一位,若不能为0,则不能被2整除。
所以,其实本问题其实是求N!含有多少个2,最低位1的位置等于N!中含有2的个数加1。
代码如下:
//计算n的阶乘的二进制中最低位1的位置,
//返回值表示倒数第几位;
static long LowestOnew(long n)
{
long num=;
while(n!=)
{
num=num+n/;
n=n/;
}
return num+;
}
ACM_数论_阶乘N!的末尾有几个零 和 末尾有多少个 1 nyoj 954的更多相关文章
- 哪几个数的阶乘末尾有n个零?
题目:哪几个数的阶乘末尾有n个0?其中n是一个正整数,从键盘输入. int main( void ) /* name: zerotail.cpp */ { int num, n, c, m; cout ...
- BZOJ_4176_Lucas的数论_杜教筛+莫比乌斯反演
BZOJ_4176_Lucas的数论_杜教筛+莫比乌斯反演 Description 去年的Lucas非常喜欢数论题,但是一年以后的Lucas却不那么喜欢了. 在整理以前的试题时,发现了这样一道题目“求 ...
- ALGO-157_蓝桥杯_算法训练_阶乘末尾(高精度)
问题描述 给定n和len,输出n!末尾len位. 输入格式 一行两个正整数n和len. 输出格式 一行一个字符串,表示答案.长度不足用前置零补全. 样例输入 样例输出 数据规模和约定 n<=, ...
- BASIC-30_蓝桥杯_阶乘计算
题目: 问题描述 输入一个正整数n,输出n!的值. 其中n!=1*2*3*…*n. 算法描述 n!可能很大,而计算机能表示的整数范围有限,需要使用高精度计算的方法.使用一个数组A来表示一个大整数a,A ...
- 找出n的阶乘末尾有几个零
原理:因为10由2*5组成,而构成2的因数比5多 所以最终转换成求5的个数 int getNumber(int n) { int count = 0; while(n) { n = n/5; coun ...
- [bzoj4659\2694]Lcm_数论_莫比乌斯反演
Lcm bzoj-4659 bzoj-2694 题目大意:给出A,B,考虑所有满足l<=a<=A,l<=b<=B,且不存在n>1使得n^2同时整除a和b的有序数对(a,b ...
- java将数组中的零放到末尾
package com.shb.java; /** * 将数组中的0放到数组的后边,然后原来的非零数的顺序不改变 * @author BIN * */ public class Demo2{ publ ...
- 算法基础_递归_给定m个A,n个B,一共有多少种排列
问题描述: 给定m个A,n个B,一共有多少种排列 解题源代码: /** * 给定m个A,n个B,问一共有多少种排列 * @author Administrator * */ public class ...
- Django学习路22_empty为空,forloop.counter 从1计数,.counter0 从0计数 .revcounter最后末尾数字是1,.revcounter0 倒序,末尾为 0
当查找的数据不存在,返回为 空时 在 html 中使用 {%empty%} 语句 进行显示 def getstudents(request): students = Student.objects.a ...
随机推荐
- XML-RPC 实现C++和C#交互
我们通常会面对这样的问题:整合不同平台或不同类库,这些类库可能来自不同的语言,甚至不同的操作系统. 如何解决这类棘手的问题呢? 一.方案介绍 解决不同语言交互的方法有不少,对我了解的windows系统 ...
- JQuery选择器中的一些注意事项
1. 选择器中含有特殊符号的注意事项 1. 1 选择器中含有",","#","("或"]"等特殊字符 根据w3c的规定, ...
- Hadoop 添加删除Slave
Hadoop 添加删除Slave @(Hadoop) 在hdfs-site.xml文件中添加如下配置: <property> <name>dfs.hosts</name& ...
- Ubuntu14.04配置nginx开机自启动项
原文: https://www.jianshu.com/p/2e03255cfabb ubuntu配置开机自动启动服务 ---------------------------------------- ...
- iOS 使用腾讯地图显示用户位置注意事项
1. 向 target中info 加入 NSLocationWhenInUseUsageDescription,string 类型.值是描写叙述为什么须要用户位置,这句话会出如今 提示用户是否同意a ...
- Afinal的jar包进行代码混淆出错
今天用到了代码混淆,混淆过后APP不能够运行,老报错,由于项目中只用了Afinal的第三方库,于是按照网上给出的答案为了不混淆Afinal的jar包,在配置文件中写入了下面的语句: -libraryj ...
- UVa145 Gondwanaland Telecom
Time limit: 3.000 seconds 限时:3.000秒 Problem 问题 Gondwanaland Telecom makes charges for calls accordin ...
- webDriver API——第6部分Locate elements By
These are the attributes which can be used to locate elements. See the Locating Elements chapter for ...
- 2、jQuery选择器
2.1 基本选择器 它有元素Id.Class.元素名.多个选择符组成,通过基本选择器可以实现大多数页面元素的查找. 选择器 功能 返回值 #id 根据给定的ID匹配一个元素 单个元素 element ...
- Tomcat 监控的几种方法
Tomcat 监控方法 方法1:.使用tomcat自带的status页 具体方法: 步骤1:修改%tomcat安装路径%\conf \tomcat-users文件,配置admin设置权限.在<t ...