Write an algorithm which computes the number of trailing zeros in n factorial.
阶乘n! = n*(n-1)*...*1
要计算出这样的运算结果有多少个零,如果直接运算就很可能是溢出,那么只能用其他方法了。
因为尾零得来是由于2*5等于10,那么就会为结果增加一个零,所以只要计算这两个数出现了多少对就可以了。但是由于2出现的次数会远远大于5,所以,只要计算5的倍数出现多少次。
程序本身很好理解,就是如何想出来的确是个麻烦。
老实说,我也是参考书上的分析再写出来的,具体需要怎么样才能想出来,我觉得就需要举例子,然后观察,最后总结出规律,难度还是很大的。
书中说:By thinking through what exactly will contribute a zero ,you can come up with a solution.
程序1:
int factorialZero(int n)
{
if (n < 0)
{
return -1;
}
int fiveNums = 0;
//注意:这里是i<=n
for (int i = 5; i <= n; i+=5)
{
//注意:这里必须要定义一个j,否则会改变了i的值,使得结果不正确的。
int j = i;
while (j%5 == 0)
{
fiveNums++;
//注意:这里是要这样计算
j /= 5;
}
}
return fiveNums;
}
程序2:
int factorFive(int n)
{
int c = 0;
while (n%5 == 0)
{
c++;
n /= 5;
}
return c;
}
int factorialZero2(int n)
{
if (n < 0)
{
return -1;
}
int fiveNums = 0;
for (int i = 5; i <= n; i+=5)
{
fiveNums += factorFive(i);
}
return fiveNums;
}
程序3,这个优化了的程序就更加难以想象出来了。举个例子就能知道它是如何计算的了。
int improFactoriaolZero(int n)
{
if (n < 0)
{
return -1;
}
int fiveNums = 0;
for (int i = 5; n/i > 0; i*=5)
{
fiveNums += n/i;
}
return fiveNums;
}
主测试程序:
int main()
{
cout<<"factorialZero(25-55):\n";
for (int i = 25; i <= 55; i++)
{
cout<<factorialZero(i)<<" ";
}
cout<<endl;
cout<<"factorialZero2(25-55):\n";
for (int i = 25; i <= 55; i++)
{
cout<<factorialZero2(i)<<" ";
}
cout<<endl;
cout<<"improFactorialZero(25-55):\n";
for (int i = 25; i <= 55; i++)
{
cout<<improFactoriaolZero(i)<<" ";
}
cout<<endl;
system("pause");
return 0;
}
运行结果,计算了25阶乘,一直到55阶乘的尾零分别为多少:
分享到:
相关推荐
这是一个关于阶乘运算的小程序,它用俩种方式实现了阶乘,分别是循环和递归。这俩段代码都可以正常运行,本人在MyEclipse8.6的环境下进行过机试,完全正确运行,请放心下载!
实现了大数精确的计算并输出,可以用于要求得到精确值的算法中。
输入 计算阶乘的数 得到结果 很简单的小程序
最新单片机仿真 用P0口显示逻辑与运算结果最新单片机仿真 用P0口显示逻辑与运算结果最新单片机仿真 用P0口显示逻辑与运算结果最新单片机仿真 用P0口显示逻辑与运算结果最新单片机仿真 用P0口显示逻辑与运算结果最新...
阶乘运算
用java计算大数的阶乘,记得应该可以十秒内算出1000以内阶乘(时间很久了,大概是这样)。理论上是可以算无限大的数的阶乘的。可以作为程序设计实验课的作业。核心算法,没有赔UI。复制粘贴即可运行
最新单片机仿真 用P0口、P1 口分别显示加法和减法运算结果最新单片机仿真 用P0口、P1 口分别显示加法和减法运算结果最新单片机仿真 用P0口、P1 口分别显示加法和减法运算结果最新单片机仿真 用P0口、P1 口分别显示...
适用于c语言计算一个整数n的阶乘,主要用到了for函数,
最新单片机仿真 用P1、P0口显示除法运算结果最新单片机仿真 用P1、P0口显示除法运算结果最新单片机仿真 用P1、P0口显示除法运算结果最新单片机仿真 用P1、P0口显示除法运算结果最新单片机仿真 用P1、P0口显示除法...
模拟阶乘运算,可算超出数据范围较大阶乘值
示例VB的阶乘运算,排列算法,组合运算算法等,在使用时注意,点击等号进行运算。在框中输入计算值,然后点等号。
多线程实现阶乘运算.zip
可以算1000左右的大数阶乘,如果要算更大,改变数组的大小
以为万进位制,将万以内的数视为个位数,简洁。
用C语言来实现1-10000的阶乘运算,克服了平常数据会溢出的问题。
VB6.0 使用递归过程实现阶乘运算 Function F(n As Integer) As Single If n > 1 And n F = n * F(n - 1) Else F = 1 End If End Function Private Sub Command1_Click() Text2.Text = F(Val(Text...
278-用P1、P0口显示除法运算结果(51单片机C语言实例Proteus仿真和代码)278-用P1、P0口显示除法运算结果(51单片机C语言实例Proteus仿真和代码)278-用P1、P0口显示除法运算结果(51单片机C语言实例Proteus仿真和代码)...
C#三个小程序 乘法运算 求阶乘和的运算 判断素数
(2)编写一个包含主方法main的公共类(访问权限为public的类),主方法main中完成的任务是:从键盘上输入两个运算数(double 类型)和一个运算符(char 类型),使用(1)中的类输出运算结果(保留两位小数)。...
用P0 口显示指针运算结果.zip