试统计正整数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;
}
结果: