C语言趣味程序的一个问题

C语言趣味程序的一个问题,第1张

     这段程序用于计算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

}


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12167912.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-21
下一篇 2023-05-21

发表评论

登录后才能评论

评论列表(0条)

保存