在很多面試的題目中,求n!結(jié)果中零的個(gè)數(shù)也是經(jīng)常遇到的一道題目。那么這道題目的解決方法究竟是什么呢?我愿意在此和大家分享一下我自己的一些看法,有不同見解的朋友歡迎多提意見。
求n!中零的個(gè)數(shù)主要在于乘數(shù)中有沒有能被2和5整除的數(shù),只要能找到被2和5整數(shù)的乘數(shù)即可,所以,我的代碼流程是這樣的:
(1)查找當(dāng)前數(shù)據(jù)中有沒有可以整除2的整數(shù),同時(shí)修改整數(shù)的數(shù)值
(2)查找當(dāng)前數(shù)據(jù)中有沒有可以整除5的整數(shù),同時(shí)修改整數(shù)的數(shù)值
(3)如果1、2的條件同時(shí)滿足,表示已經(jīng)有一個(gè)零了,count++
(4)重復(fù)1、2的過(guò)程,直到1、2中有一個(gè)條件為假
說(shuō)了這么多,那么代碼應(yīng)該怎么書寫呢?下面是我個(gè)人寫的一個(gè)例子,歡迎大家寫出自己的想法:
int count_zero_number(int value)
{
int count;
int index;
int* pData;
int flag_two;
int flag_five;
if(value <= 0)
return 0;
pData = (int*)malloc(sizeof(int) * value);
assert(NULL != pData);
memset(pData, 0, sizeof(int) * value);
for(index = 0; index < value; index ++){
pData[index] = index + 1;
}
count = 0;
do{
/* reset the flag value */
flag_two = 0;
flag_five = 0;
for(index = 0; index < value; index ++){
if( 0 == (pData[index] % 2)){
pData[index] /= 2;
flag_two = 1;
break;
}
}
if(!flag_two)
break;
for(index = 0; index < value; index ++){
if( 0 == (pData[index] % 5)){
pData[index] /= 5;
flag_five = 1;
count ++;
break;
}
}
}while(flag_five);
free(pData);
return count;
}