【思特奇杯·云上蓝桥-算法集训营】第1周 阶乘约数 Java

题目描述:
2题 阶乘约数
问题描述
定义阶乘 n! = 1 × 2 × 3 × ··· × n。
请问 100! (100 的阶乘)有多少个约数。
答案提交
这是一道结果填空的题,你只需要算出结果后提交即可。
本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无
法得分

题目解析:
由于100的阶乘这个数特别大,我们不能用普通的方法来写,这是我们就要用到约数的简便运算。
简便运算:
首先把这个数先用2、3、5、7、11、13、…等质数的连乘积表示。
比如24 = 2223 = 2³ * 3再用各个质数的指数加一后再相乘即为此数的约数个数,比如 (3+1)(1+1)=4*2=8, 即表示24有8个约数。
例如:
1200000 = 2^7 * 3 * 5^5;
所以约数个数有(7+1) * (1+1) * (5+1) = 8 * 2 * 6 =96
知道上面的简便方法后,这题就有了一个思路。我们可以算出100之内的每一个数关于其质数的约数,就像质数2出现了多少次,3出现了多少次,将他们的质数加一相乘,就可以得到100的阶乘的约数。

解题代码:

public class 阶乘约数 {
    public static void main(String[] args) {
        int[] p=new int[101];
        for (int i = 2; i <= 100; i ++)
        {
            int n = i;
            for (int j = 2; j <= n / j; j ++) {//这里j<=n也可以,代码在下面,就少了一个if语句
                while (n % j == 0) {
                    p[j]++;
                    n /= j;
                }
            }
            if(n > 1) p[n] ++;
        }

        long ans=1;
        for (int i = 2; i <= 100; i++)
        {
            if (p[i]!=0)
            {
                ans *= p[i] + 1;//这一步就是说的那个约数算法公式
            }
        }

        System.out.println(ans);

    }
}

代码解析2:

public class 阶乘约数 {
    public static void main(String[] args) {
        int[] p=new int[101];
        for (int i = 2; i <= 100; i ++)
        {
            int n = i;
            for (int j = 2; j <= n ; j ++) {//这里j<=n也可以
                while (n % j == 0) {
                    p[j]++;
                    n /= j;
                }
            }
          
        }

        long ans=1;
        for (int i = 2; i <= 100; i++)
        {
            if (p[i]!=0)
            {
                ans *= p[i] + 1;
            }
        }
        System.out.println(ans);
    }
}

题目答案:
在这里插入图片描述
题后反思:
我刚开始的思路并不是这样,原本我是想将100的阶乘给算出来,但是写的时候发现这种方法并不可行,100的阶乘实在是太大了,而且即使算出来,算约数的时候所需的时间也会更长。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值