刷题第一天

发布时间:2024年01月20日

1.阶乘求和

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

提示:答案首位不为?0?。

很明显,这题如果死算肯定会超出最大数据类型的范围,n∈[1,202320232023],n越大,其中包含10,2,5,的数字(5,12,25,32......)也变多,这些数字相乘末尾为0,这些数字越多,末尾的0也就越多,我们要求最后九位数字,我们就先看看到什么程度的时候最后九位数字都为0,最后我们再求后九位不为0的数的阶乘之和,这样数字范围就不会超标了,所以我们先估计一下大概多少数的阶乘会有9个0,假设50

import java.math.BigInteger;

public class question1 {
    public static void main(String[] args) {
        BigInteger n=new BigInteger("1");
        BigInteger sum=new BigInteger("0");
        for(int i=1;i<50;i++) {
            n=n.multiply(new BigInteger(""+i));
            sum=sum.add(n);
            System.out.println("i="+i+"时,sum后九位是:"+sum.mod(new BigInteger(""+1000000000)));
        }
    }
}

然后我们看运行结果,很明显当i>38,sum的后九位都是维持在420940313,所以这就是结果?

?

http://t.csdnimg.cn/R1h0G? ? ? 代码借鉴于该链接

2.幸运数字
哈沙德数是指在某个固定的进位制当中,可以被各位数字之和整除的正整数。例如 126 是十进制下的一个哈沙德数,因为 (126)10 mod (1+2+6) = 0;126也是八进制下的哈沙德数,因为 (126)10 = (176)8,(126)10 mod (1 + 7 + 6) = 0;同时 126 也是 16 进制下的哈沙德数,因为 (126)10 = (7e)16,(126)10 mod (7 + e) = 0。小蓝认为,如果一个整数在二进制、八进制、十进制、十六进制下均为哈沙德数,那么这个数字就是幸运数字,第 1 至第 10 个幸运数字的十进制表示为:1 , 2 , 4 , 6 , 8 , 40 , 48 , 72 , 120 , 126 . . . 。现在他想知道第 2023 个幸运数字是多少?你只需要告诉小蓝这个整数的十进制表示即可。

这里简单讲解一下题目,mod 的意思是:a mod b = 0,就是 a ÷ b 的余数为0(怕有不知道的小伙伴,我这里解释一下)

public class {
    public static void main(String[] args) {
        int j=0;
        for (int i=1;i<10000000;i++){
            if (BaseConversion(i)){
                j++;
                if (j==2023){
                    System.out.println(i);//215040
                    break;
                }
            }
        }
    }
    public static boolean BaseConversion(int n){
        //十进制
        int sum=0;
        int x=n;
        while (x!=0){
            sum+=(x%10);
            x/=10;
        }
        if (n%sum!=0)
            return false;
        //二进制
        sum=0;
        x=n;
        while (x!=0){
            sum+=(x%2);
            x/=2;
        }
        if (n%sum!=0)
            return false;
        //八进制
        sum=0;
        x=n;
        while (x!=0){
            sum+=(x%8);
            x/=8;
        }
        if (n%sum!=0)
            return false;
        //十六进制
        int[] arr={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};
        sum=0;
        x=n;
        while (x!=0){
            sum+=(arr[x%16]);
            x/=16;
        }
        if (n%sum!=0)
            return false;
        return true;
    }
}
 

http://t.csdnimg.cn/lARtX? ? 上面代码借鉴于该连接

文章来源:https://blog.csdn.net/qq_40841463/article/details/135702490
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。