普通算法题

144 阅读2分钟

1.阶乘求和

题目来自去年的蓝桥杯javab组

【问题描述】

令 S = 1! + 2! + 3! + ... + 202320232023! ,求 S 的末尾 9 位数字。

提示:答案首位不为 0 。

看到题目估计都会被三个2023给唬住,如果想遍历202320232023个数的阶乘显然是行不通的.

思路:

1.说是求最后的9位数,那么我们可以想象一个数和另一个数的后九位数相加和两个数相加的最后的九位数相加是没有用区别的,那么我们可以便利数的时候对数字求余就行了

2.根据上面分析还是要遍历那么多数字,但是真的要算到202320232023吗?真要算的话时间指定要超时. 你们可以从数字本身结构下手,比如10的阶乘最后两位数一定是00,因为中间有2*5,10.后面的数字也是15开始变最后是000,以此类推发现到了40以后,无论多少最后九位数一定是0,那么我们只需算到40的阶乘就行了

结合以上两点我们可以试试解题

public class text2 {
    public static void main(String[] args) {
        long start=1;
        long sum=0;
        long num=1;
        while(start<41){
            num*=start;
            num%=1000000000;
            sum+=num;
            sum%=1000000000;
            start++;
            if(start>38){
                System.out.println(sum);
            }
        }
    }
}

这边我打印了最后几个数的末尾

image.png

得到结果

当然我们也可以测试运行时间

public class text2 {
    public static void main(String[] args) {
        long starttime = System.currentTimeMillis();
        long start=1;
        long sum=0;
        long num=1;
        while(start<40){
            num*=start;
            num%=1000000000;
            sum+=num;
            sum%=1000000000;
            start++;
        }
        System.out.println(sum);
        long endtime = System.currentTimeMillis();
        System.out.println(endtime-starttime);

    }
}

用system.currenttimemilli方法就行了,

image.png

结果为1Ms!!!当然这和编译器和电脑有关!