这段程序用于计算100的阶乘末尾的零的个数,思路如下:末尾零的个数就代表含有因子10的个数,而10=2*5,所以每一对2和5因子就对应结果末尾的一个零,所以结果末尾的零的个数即为因子2和5的组合的数量,亦即为因子2和5中数量少的一个,很明显因子2的个数比因子5的个数多,所以只需求100以内因子5的个数。
首先计算100以内能被5整除的个数,对应代码:
for(a=5 a<=100 a+=5){
count++
又因为能被25整除的数含有两个因子5,所以还须加1,对应代码:
if(!(a%25)) count++题眼就是求出2~10的最小公倍数,然后减一。模拟排队的算法是可行的,但不是最优的。
#include <stdio.h>
int od(int x,int n) //x是否能被n整除,是返回1,否返回0
{
if (x%n) return 0
return 1
}
int gbs(int a[],int n) //求a[n]内所有元素的最小公倍数
{
int i,j,k,o,m=0
int b[20],c[100]
for (i=0i<ni++)
{
if(m<a[i]) m=a[i]
b[i]=a[i]
}
j=2o=0
while (j<=m)
{
k=0
for (i=0i<ni++){
if (od(b[i],j)) k++
if (k>1) break
}
if(k>1)
{
c[o++]=j
for (i=0i<ni++)
if (od(b[i],j)) b[i]=b[i]/j
m=0
for (i=0i<ni++)
if(m<b[i]) m=b[i]
}
else
j++
}
k=1
for(i=0i<oi++)
{
k*=c[i]
}
for (i=0i<ni++)
{
k*=b[i]
}
return k
}
main()
{
int a[10]
for(int i=1i<=10i++)
a[i-1]=i
printf("count=%d\n",gbs(a,10)-1)
getchar()
return 0
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)