程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> 一步一步寫算法(之n!中末尾零的個數統計)

一步一步寫算法(之n!中末尾零的個數統計)

編輯:關於C語言

 

【 聲明:版權所有,歡迎轉載,請勿用於商業用途。  聯系信箱: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;

}

 

 

 

 

【預告: 下一篇博客主要介紹隨機撲克牌的算法】  

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved