整数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);

    }

}





  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值