1. 程式人生 > >整數N的因子個數和N!的因子個數(數學問題)

整數N的因子個數和N!的因子個數(數學問題)

N的因子個數:

條件:給定任意一個一個正整數N

要求:求其因子的個數

首先給出結論:對於任意的整型N,分解質因數得到N= P1^x1 * P2^x2* …… * Pn^xn;(p1,p2,p3...pn是質數2,3,5,7..........)

則N的因子個數M為 M=(x1+1) * (x2+1) * …… *(xn+1);

解析:如果N的因子的個數用上面的思路求的話,分解質因數的時候會非常麻煩,不僅最大的質因數不定,而且每個質因數的冪也不確定,所以在求N的因子個數的時候還是用基本的方法來求,i從1迴圈到N,判斷N除以i取餘是否為0,如果為0,因子個數加1

基本方法求N的因子個數的程式如下:


import java.util.Scanner;


//求整數N的因子的個數
public class YinZi {

    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Scanner sc=new Scanner(System.in);
        int N=sc.nextInt();
        
        int flag=0;//用來儲存因子的個數
         for(int i=1;i<=N;i++)
         {
             if(N%i==0)
                 flag++;
         }
        System.out.println(N+"的因子的個數為:"+flag);
    }

}

N!的因子個數:

a.  最大的質因子一定不會大於N

b.  N的質因子並不完全包含N!所有的質因子(例如:36的質因子為2,3,36!的質因子有,2,3,5,7......)   N!的所有質因子是小於等於N的所有質數

思路:

用到上面求N的因子個數的思路

首先,我們可以把所有的N以內的質數給打表求出來

然後,求每一個質因子的指數個數,這裡用到了一個公式,:

ei = [N/pi^1] +  [N/pi^2] + …… +  [N/pi^n]  其中[]為取整

例如:10!=1*2*3*4*5*6*7*8*9*10

ei=2=[N/2]+[N/4]+[N/8]=5+2+1;

1*2*3*4*5*6*7*8*9*10    10/2=5,說明10可以由5個2組成,也就是2+2+2+2+2,也就是2,4,6,8,10,但是ei 是2*4*6*8*10,   10/2=5代表5個數中分別包含了一個2,     以此類推,10/4=2   代表4,8 需要分別再加一個2,  10/8代表8需要再加一個2,直到10/16=0為止

最後,就是套公式計算了,M=(e1+1)*(e2+1)*……*(en+1)

N!的因子的個數的程式:

import java.util.Scanner;

/*求N!的因子的個數
 * 步驟1.從控制檯得到一個整數N
 * 步驟2.求N以內的所有質數(用篩法)
 * 步驟3.根據公式ei = [N/pi^1] +  [N/pi^2] + …… +  [N/pi^n]  其中[]為取整求每個質因數的冪
 * 步驟4.根據公式M=(e1+1)*(e2+1)*……*(en+1)求得M值也就是因子的個數
 * 步驟5.輸出M的值
 */
public class YinZi2 {

    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        //步驟1
        Scanner sc=new Scanner(System.in);
        int N=sc.nextInt();
        
        //步驟2
        int[] a=new int[N+1];
        for(int i=2;i<N/2;i++)
        {
            if(a[i]==1) continue;
            for(int j=2;j<=N/i;j++)
            {
                if(i*j<=N) a[i*j]=-1;
            }
        }
        
        //步驟3,4
        int M=1;
        for(int i=2;i<=N;i++)
        {
            if(a[i]==0)
            {
                for(int j=1;j<=N/i;j++)
                {
                    a[i]+=N/Math.pow(i, j);
                }
                M*=a[i]+1;
            }
        }
        
        //步驟5
        System.out.println(N+"的階乘的因子的個數是:"+M);

    }

}