整數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);
}
}