您的位置:首页 > 编程语言 > Java开发

整数N的因子个数和N!的因子个数(数学问题)

2013-04-25 10:19 190 查看
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);

    }

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Java