<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    走在架構師的大道上 Jack.Wang's home

    Java, C++, linux c, C#.net 技術,軟件架構,領域建模,IT 項目管理 Dict.CN 在線詞典, 英語學習, 在線翻譯

    BlogJava 首頁 新隨筆 聯系 聚合 管理
      195 Posts :: 3 Stories :: 728 Comments :: 0 Trackbacks
     階乘是個很有意思的東西,可能很多朋友看到關于他的計算就怕了,其實沒什么,看完下面兩個問題您應該有低了。

            1.       給定一個 N ,求出N!末尾有多少個零,比如 N=10,N!=3628800,N!末尾有兩個零。
    2.       N!的二進制表示中最低為1的位置,比如 11010010, 最低為1的位置為2

    問題一解法:

        在上一個 blog 中介紹的子數組乘積最大值的問題中,有朋友考慮到溢出的問題,在這個問題中,我們從那些數相乘能得到10這個命題開始思考。比如N=K×10m那么N!后面就有m個零。這個問題轉化為將N!進行分解,如N=2a×3b×5c 很顯然 10=2×5,那么零的個數m=min(a,c), 一個數能夠被2整除的機率比5要大很多因此 m=c,因此轉化為求 c的問題,具體算法如:

     1publicclass factorial {
     2

     3    privatestaticint zeroNum(int n) 
    {
     4

     5       int ret = 0
    ;
     6

     7       for (int i = 1; i <= n; i++
    {
     8

     9           int j =
     i;
    10

    11           while (j % 5 == 0
    {
    12

    13              ret++
    ;
    14

    15              j /= 5
    ;
    16

    17           }

    18
    19       }

    20
    21
           returnret;
    22

    23    }

    24
    25    privatestatic BigInteger fac(long n) 
    {
    26

    27       BigDecimal a = new BigDecimal(1
    );
    28

    29
           BigDecimal b;
    30

    31       for (long i = 1; i <= n; i++
    {
    32

    33           b = new
     BigDecimal(i);
    34

    35           a =
     a.multiply(b);
    36

    37       }

    38
    39       return
     a.toBigInteger();
    40

    41    }

    42

    問題二解法:

    我們都知道一個數除以2可以表示為 N>>1,即向右移動一位。這個問題轉化為求 N! 含有2的質因數的個數問題。

     1    staticclass PrimeFactor {
     2

     3       publicstaticint primeFactor(int n) 
    {
     4

     5           int ret = 0
    ;
     6

     7           while (n != 0
    {
     8

     9              n >>= 1
    ;
    10

    11              ret +=
     n;
    12

    13           }

    14
    15           return ret + 1
    ;
    16

    17       }

    18
    19       publicstatic String binaryString(int n) 
    {
    20

    21           return
     Integer.toBinaryString(fac(n).intValue());
    22

    23       }

    24
    25    }

    26

    完整程序:

      1package org.blogjava.arithmetic;
      2

      3import
     java.math.BigDecimal;
      4

      5import
     java.math.BigInteger;
      6

      7
    /**
      8
      9 * @author
     Jack.Wang
     10

     11 * @see http://jack2007.blogjava.net/

     12
     13 */

     14
     15public class factorial 
    {
     16

     17       private static int zeroNum(int n) 
    {
     18

     19              int ret = 0
    ;
     20

     21              for (int i = 1; i <= n; i++
    {
     22

     23                     int j =
     i;
     24

     25                     while (j % 5 == 0
    {
     26

     27                            ret++
    ;
     28

     29                            j /= 5
    ;
     30

     31                     }

     32
     33              }

     34
     35              return
     ret;
     36

     37       }

     38
     39       private static BigInteger fac(long n) 
    {
     40

     41              BigDecimal a = new BigDecimal(1
    );
     42

     43
                  BigDecimal b;
     44

     45              for (long i = 1; i <= n; i++
    {
     46

     47                     b = new
     BigDecimal(i);
     48

     49                     a =
     a.multiply(b);
     50

     51              }

     52
     53              return
     a.toBigInteger();
     54

     55       }

     56
     57       static class PrimeFactor 
    {
     58

     59              public static int primeFactor(int n) 
    {
     60

     61                     int ret = 0
    ;
     62

     63                     while (n != 0
    {
     64

     65                            n >>= 1
    ;
     66

     67                            ret +=
     n;
     68

     69                     }

     70
     71                     return ret + 1
    ;
     72

     73              }

     74
     75              public static String binaryString(int n) 
    {
     76

     77                     return
     Integer.toBinaryString(fac(n).intValue());
     78

     79              }

     80
     81       }

     82
     83       public static void main(String[] args) 
    {
     84

     85              System.out.println("12!為" + fac(12+ ",后面零的個數為" + zeroNum(12
    ));
     86

     87              System.out.println("12!的二進制為" + PrimeFactor.binaryString(12+ ",1的位置"

     88
     89                            + PrimeFactor.primeFactor(12
    ));
     90

     91       }

     92
     93       
    /**
     94
     95
            out: 
     96

     97
            12!為479001600,后面零的個數為2
     98

     99
            12!的二進制為11100100011001111110000000000,1的位置11
    100

    101        */

    102
    103}

    104




    本博客為學習交流用,凡未注明引用的均為本人作品,轉載請注明出處,如有版權問題請及時通知。由于博客時間倉促,錯誤之處敬請諒解,有任何意見可給我留言,愿共同學習進步。
    posted on 2008-10-18 12:05 Jack.Wang 閱讀(4303) 評論(1)  編輯  收藏 所屬分類: 數學&算法

    Feedback

    # re: 微軟面試題---階乘問題 2008-10-22 17:01 icalm
    private static int zeroNum(int n){
    int ret = 0;

    while(n >= 5){
    ret += n/5;
    n = n / 5;
    }
    return ret;
    }  回復  更多評論
      

    主站蜘蛛池模板: 精品无码国产污污污免费网站国产| 亚洲一久久久久久久久| 一级毛片**免费看试看20分钟| 四虎成人免费网站在线| 亚洲另类无码专区丝袜| 午夜一区二区免费视频| 亚洲一久久久久久久久| 免费看片A级毛片免费看| 亚洲.国产.欧美一区二区三区| 国产精品无码一二区免费| 无遮挡a级毛片免费看| 亚洲裸男gv网站| 中文字幕乱码免费看电影| 亚洲国产一区二区a毛片| 在线人成精品免费视频| 久久亚洲最大成人网4438| 国产三级免费观看| www.xxxx.com日本免费| 亚洲高清在线视频| 久草免费在线观看视频| 亚洲av午夜国产精品无码中文字| 日本不卡在线观看免费v| 猫咪免费人成在线网站| 亚洲视频在线一区二区三区| 国产高清在线免费视频| 老湿机一区午夜精品免费福利| 亚洲va中文字幕无码| 国产黄在线播放免费观看| 国产亚洲精品无码成人| 9420免费高清在线视频| 亚洲AV无码无限在线观看不卡| 日本黄色免费观看| 毛片基地看看成人免费| 亚洲性69影院在线观看| 亚洲 综合 国产 欧洲 丝袜| 亚洲av成人一区二区三区在线观看| 一级毛片视频免费| 亚洲欧洲日本国产| 国产国拍亚洲精品福利| 4399影视免费观看高清直播| 精品无码专区亚洲|