阶乘求零的个数(注意中间的零也要求)高手进

来源:百度知道 编辑:UC知道 时间:2024/05/15 07:15:43
1*4*7*10...*700 问这个结果中有多少个零(编写一个函数)

******************************注意:是求零的个数,包括中间的零,请不要把求末尾零的个数的方法贴上来******************************

我想了半天这个题目,想到了以下算法:
#include <iostream.h>
void main()
{
int i,cnt,count=0;
for(i=1;i<=700;i+=3)
{
cnt=i;
while(cnt)
{

if(cnt%25==0)count+=2;
else if(cnt%5==0)count++;
cnt/=10;

}
}
cout<<"the count of zero is"<<count<<endl;

}
解题思想是:求约数5的个数,因为偶数的个数肯定大于约数5的个数,如果这个数能被5^n整除,将在末尾引进n个0.

如果这个数整除10后,能被5^n整除,将在中间引进n个0.比如501 它不是5的约数,但整除10后为50,是5^2的倍数,故在中间引进2个0,即1002

但还是有错误,比如9*12 得108 并无5的约数,但中间也有个0

希望高手帮忙解决一下,谢谢
这道题目的难点是不能用一个大的整数来保存阶乘的结果(溢出),所以需要用一个数组来保存这个位上的数字,例如 array[200],其中用array[0]来保存这个大整数的位数,array[1]以后依次保存各个位上的值。最好只要统计array[array[0]]中0的个数就可以了。具体思路应该是这样的,好像是用分治法吧。具体怎么编还请高手来解决。

这道题末尾的0的个数是62,除末尾的0外至少还有503位数字,我个人认为这503位数字中0的个数是没法算出来的,只有算出答案才能知道。就像你所说,不能用一个大的整数来保存阶乘的结果。我只能给你一个算法,程序你自己编。定义4个505位数组,个位积G〔〕、十位积S〔〕、百位积B〔〕、总积J〔〕。定义几个变量,2的个数EW=60,5的个数WW=60,J1=7(700/(2*2)(5*5)),乘数CS=697,进位JW=0,乘数CS的个位CSG,乘数CS的十位CSS,乘数CS的百位CSB。
乘数CS循环减3,是2的倍数除以2,EW减1,还是2的倍数再除以2,EW减再1,直至EW=0;WW照此办理,目的是剔除最后62个0,因为700已经剔除了两个2和两个5,所以EW和WW的初值是60。可将CS=1作为跳出循环的条件。
取乘数的个位CSG与J〔〕相乘,G1=J1*CG积的个位,JW=积的十位,依次Gi=(Ji*CG+JW)的个位,JW=(Ji*CG+JW)的十位。当Ji为空时,如果JW不为0,G(i+1)=JW,可将Gi为空作为跳出循环的条件。
同理,取乘数的十位数CSS可算出十位积S〔〕、取乘数百位数CSB可算出百位积B〔〕。
总积J〔〕的运算是J1=G1、J2=G2+S1的的个位,JW=G2+S1的十位、J3=(G3+S2+B1+JW)的个位、JW=(G3+S2+B1+JW)的十位,依次Ji=(Gi+S(i+1)+B(i+2)+JW)的个位、JW=(Gi+S(i+1)+B(i+2)+JW)的十位。当Bi为空时,如果JW不为0,J(i+1)=JW,可将Bi为空作为跳出循环的条件。
值得注意的是每一步运算如果没有进位,一定要将JW置0.
最后,数出J〔〕中0的个数再加上62即为所求。

FOR()
函数循环,相乘,出结果

条件循环

结果除以10, 取余数,判断是否是0,

如果是,累加器 加1

结果=int(结果/10) ' 这个地方用截断或者format()都可以,因为这个数除以10以后就,最后一位变成小数点了,然后把这位去掉即可.一直去到最后一位.
如果 结果<1