枚举算法:试统计正整数n的阶层n!=1*2*...*n尾部连续零的个数。

试统计正整数n的阶层n!=12…*n尾部连续零的个数。

思路:
首先通过常用对数累加和s=lg2+lg3+…+lg n确定n!的位数m=s+1,即a数组元素的个数。设计两重循环,模拟整数竖式乘法实施各数组元素的累乘:乘数k依次为2,3,…,n。累乘积各位存入aj。实施乘运算:t=a[j]*k+g;a[j]=t%10;g=t/10;尾部连续零的个数统计:从j=1时低位a[j]开始,a[j]=0时j++;做统计,直到a[j]!=0时结束。
流程图:
在这里插入图片描述
代码:

#include<time.h>
#include<math.h>
#include<stdio.h>
int main() {
	double op,ed;
	double time;
	op=clock();

	int j,k,m,n,a[40000];
	long g,t;
	double s;
	printf("请输入正整数n(n<10000):");
	scanf("%d",&n);
	s=0;
	for(k=2; k<=n; k++)
		s+=log10(k);
	m=(int)s+1;
	for(k=1; k<=m; k++)
		a[k]=0;
	a[1]=1;
	g=0;
	for(k=2; k<=n; k++) {
		for(j=1; j<=m; j++) {
			t=a[j]*k+g;
			a[j]=t%10;
			g=t/10;
		}
	}
	j=1;
	while(a[j]==0)
		j++;
	printf("%d!尾部连续零共%d个。\n",n,j-1);

	ed=clock();
	time=ed-op;
	printf("\n");
	printf("time=%lfms\n",time);
	return 0;
}

结果:
在这里插入图片描述

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Coisini_甜柚か

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值