【 聲明:版權所有,歡迎轉載,請勿用於商業用途。 聯系信箱:feixiaoxing @163.com】
在很多面試的題目中,求n!結果中零的個數也是經常遇到的一道題目。那麼這道題目的解決方法究竟是什麼呢?我願意在此和大家分享一下我自己的一些看法,有不同見解的朋友歡迎多提意見。
求n!中零的個數主要在於乘數中有沒有能被2和5整除的數,只要能找到被2和5整數的乘數即可,所以,我的代碼流程是這樣的:
(1)查找當前數據中有沒有可以整除2的整數,同時修改整數的數值
(2)查找當前數據中有沒有可以整除5的整數,同時修改整數的數值
(3)如果1、2的條件同時滿足,表示已經有一個零了,count++
(4)重復1、2的過程,直到1、2中有一個條件為假
說了這麼多,那麼代碼應該怎麼書寫呢?下面是我個人寫的一個例子,歡迎大家寫出自己的想法:
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;
}
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;
}
【預告: 下一篇博客主要介紹隨機撲克牌的算法】