如何判断1024!末尾有多少个0

这篇博客介绍了两种计算阶乘末尾零数量的方法。第一种暴力方法直接计算阶乘,但效率低且可能溢出。第二种是因子法,通过统计5的因子个数来确定末尾零的数量,避免了溢出问题。博主提供了Java实现的代码,并指出算法的时间复杂度为O(N)。此外,还引申讨论了如何计算任意N!末尾零的通用方法。
摘要由CSDN通过智能技术生成

分析:

方法一:暴力法

  简单的方法就是就算出1024!的值,然后判断末尾有多少个0.但是这种方法有两个非常大的缺点:第一算法效率非常低下;第二:当这个数字比较大的时候直接计算阶乘可能会导致数据溢出,从而导致计算结果出现偏差。因此,下面给出另外一种比较巧妙的方法。

方法二:因子法

  5与任何一个偶数相乘都会增加末尾0的个数,由于偶数的个数肯定比5的个数多,因此1~1024所有的数字中有5的因子的个数决定了1024!末尾0的个数。因此只需要统计因子5的个数即可。此外5与偶数相乘会使末尾增加一个0,25(有两个因子5)与偶数相乘使末尾增加两个0,125(有三个因子5)与偶数相乘会使末尾增加三个0,625(有四个因子5)与偶数相乘会使末尾增加四个0。

实现代码:

package lock;

public class T17 {
	public static int zeroCount(int n)
	{
		int count=0;
		while(n>0)
		{
			n=n/5;
			count+=n;
		}
		return count;
	}

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		System.out.print("1024!末尾的0的个数为:"+zeroCount(1024));

	}

}

运行结果:

在这里插入图片描述

算法分析:

  由于这种算法循环的次数为n/5,因此算法时间复杂度为O(N)。

引申:如何计算N!末尾有几个0?

  从上面的分析可以看出N!末尾的个数为N/5+N/5^2 +N/5^3+…+ N/5^m (5^m<N 且5^(m+1)>N)。

6-2 *删除行末空白字符 分 15 作者 李祥 单位 湖北经济学院 有少初学者编程时,没有留意行末多余的空白字符,这不是好的编程习惯。现在请你编写一个,把初学者源程序文件中每行末尾多余的空白字符全都删去。 函原型 // 删除行末空白字符 void Cut(FILE *src, FILE *dst); 说明:参 src 和 dst 均为文件指针,其中:src 指示初学者的源程序文件,dst 指示整理后的源程序文件。 注: 源程序中所能输入的空白字符仅限于空格符 ' ' (<SP>) 和 制表符 '\t' (<HT>)。 最后一行末尾可能没有换行符。 每一行的长度不限。 在 Unix 或 Linux 系统下,源程序文件每行末尾一个换行符 '\n' (<LF>),而在 Dos 或 Windows 系统下,源程序文件每行末尾一个回车符 '\r' (<CR>) 和一个换行符 '\n' (<LF>)。 裁判程序 #include <stdio.h> #include <ctype.h> #include <string.h> // 删除行末空白字符 void Cut(FILE *src, FILE *dst); int main() { char sname[1024], dname[1024]; FILE *sfile, *dfile; gets(sname); gets(dname); sfile = fopen(sname, "rb"); if (!sfile) { printf("%s 无法打开!\n", sfile); } dfile = fopen(dname, "wb"); if (!dfile) { printf("%s 无法打开!\n", dfile); } if (sfile && dfile) { printf("正在整理..."); Cut(sfile, dfile); puts("整理完成!"); } if (sfile) { fclose(sfile); } if (dfile) { fclose(dfile); } return 0; } /* 你提交的代码将被嵌在这里 */
05-28
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值