> 文章列表 > 2023年【第十四届蓝桥杯】省赛java b组填空题

2023年【第十四届蓝桥杯】省赛java b组填空题

2023年【第十四届蓝桥杯】省赛java b组填空题

 第一题  

令 S = 1! + 2! + 3! + ... + 202320232023!,求 S 的末尾 9 位数字。 提示:答案首位不为 0。

 考试时的想法以及题解:

如果我们直接按照题目描述直接来求每个阶乘和的话恐怕没有什么数据类型能够胜任,在考试时我一开始使用了BigInteger 来存放数据(这个是可以来容纳的),但是程序跑起来非常慢,就是因为202320232023这个数实在是太大了,程序运行了5分钟也就到了8位数,要想运行结束估计都毕业了。所以普通方法是行不通的,如果把202320232023这个数缩小一下,比如缩小到30,你就会发现一个规律:

cef334ac25734f779656c09839491f10.png

 可以看出当数越大时他的阶乘后面的0的个数也越多,如果你做过P1100 - 阶乘末尾0的个数(二) - New Online Judge (ecustacm.cn)

你会发现当一个数的末尾有9个0时其实这个数还不超过50(50的阶乘后面有10个0),所以我们只需要把前50个数的阶乘加起来就可以了,然后再对这个数取最后9位。

代码如下:

import java.math.BigInteger;public class Main {public static void main(String[] args) {BigInteger bigInteger=new BigInteger("1");BigInteger sum=new BigInteger("1");BigInteger sum2=new BigInteger("0");while(bigInteger.compareTo(new BigInteger("50"))==-1){sum=sum.multiply(bigInteger);sum2=sum2.add(sum);bigInteger=bigInteger.add(new BigInteger("1"));}System.out.println(sum2.mod(new BigInteger("1000000000")));}
}

 结果是:420940313

 幸运数

小蓝认为如果一个数含有偶数个数位,并且前面一半的数位之和等于后面一半的数位之和,则这个数是他的幸运数字。
例如 2314 是一个幸运数字,因为它有 4 个数位,并且 2 + 3 = 1 + 4 。
现在请你帮他计算从 1 至 100000000 之间共有多少个不同的幸运数字。
本题的结果为一个整数,在提交答案时只输出这个整数,输出多余的内容将无法得分。

这个题用到了进制转换,其实java做进制转换的题还是挺方便的,用Integer.toString(num,radix)。

public class Main {public static void main(String[] args) {int num=126;String n1=Integer.toString(num,2);String n2=Integer.toString(num,8);String n3=Integer.toString(num,10);String n4=Integer.toString(num,16);System.out.println(num+"的二进制是:"+n1);System.out.println(num+"的八进制是:"+n2);System.out.println(num+"的十进制是:"+n3);System.out.println(num+"的十六进制是:"+n4);}
}

00271119592e4b9abcd0c1e179410f5d.png

 

了解进制转换后就可以直接暴力枚举了,其实也个数也不会很大1000000之内就可以求出来,时间不超过5秒钟。

代码如下:

public class Main {public static void main(String[] args) {int count=0;for(int i=1;i<1000000;i++){if(ISxys(i)){count++;System.out.println("第"+count+"个幸运数是"+i);}if(count==2023)break;}}static boolean ISxys(int num){String n1=Integer.toString(num,2);String n2=Integer.toString(num,8);String n3=Integer.toString(num,10);String n4=Integer.toString(num,16);char c1[]=n1.toCharArray();char c2[]=n2.toCharArray();char c3[]=n3.toCharArray();char c4[]=n4.toCharArray();int num1=0;int num2=0;int num3=0;int num4=0;for (int i=0;i<c1.length;i++){String s=""+c1[i];num1=num1+Integer.parseInt(s);}for (int i=0;i<c2.length;i++){String s=""+c2[i];num2=num2+Integer.parseInt(s);}for (int i=0;i<c3.length;i++){String s=""+c3[i];num3=num3+Integer.parseInt(s);}for (int i=0;i<c4.length;i++){String s=""+c4[i];if(s.equals("a"))num4+=10;else if(s.equals("b"))num4+=11;else if(s.equals("c"))num4+=12;else if(s.equals("d"))num4+=13;else if(s.equals("e"))num4+=14;else if(s.equals("f"))num4+=15;else num4=num4+Integer.parseInt(s);}return num%num1==0&&num%num2==0&&num%num3==0&&num%num4==0;}
}

结果是:215040

顺百物业科普网