试统计正整数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;}
结果:
如果觉得《枚举算法:试统计正整数n的阶层n!=1*2*...*n尾部连续零的个数。》对你有帮助,请点赞、收藏,并留下你的观点哦!