<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;
    }  回復  更多評論
      

    主站蜘蛛池模板: 亚洲免费日韩无码系列| 亚洲精品免费在线| 日本免费中文视频| 亚洲国产成人超福利久久精品| 18禁超污无遮挡无码免费网站国产| 国产亚洲综合久久| 亚洲高清在线视频| 永久在线毛片免费观看| 免费看黄的成人APP| 亚洲日韩精品无码专区加勒比☆| 亚洲午夜无码片在线观看影院猛| 91av视频免费在线观看| 色吊丝免费观看网站| 亚洲色欲www综合网| 国产精品V亚洲精品V日韩精品 | 久久久久亚洲精品天堂久久久久久| 久久久久久夜精品精品免费啦| 亚洲av日韩av永久无码电影| 亚洲AV中文无码乱人伦下载 | 亚洲?V乱码久久精品蜜桃 | 男人的天堂亚洲一区二区三区 | 免费无码国产V片在线观看| 久久久久无码精品亚洲日韩| 国产一精品一aⅴ一免费| 最近中文字幕2019高清免费| 一本一道dvd在线观看免费视频 | 91亚洲国产成人久久精品网址| 久久久久亚洲精品中文字幕 | 久久精品国产亚洲av麻豆| 国产一区二区三区免费看| 成人福利免费视频| 国产精品区免费视频| 深夜福利在线视频免费| 亚洲国产精品日韩av不卡在线 | 久久成人a毛片免费观看网站| 美女被免费视频网站| 亚洲精品宾馆在线精品酒店| 亚洲国产午夜精品理论片 | 天天爽亚洲中文字幕| 亚洲精品在线观看视频| 亚洲人成网亚洲欧洲无码久久|