赞
踩
大学生涯中第一次参加蓝桥杯,赛前也刷了部分题(简单的枚举,模拟,贪心,dfs等)。但结果却不太理想,还是好几题不会(太菜了5555555555大佬勿喷)
不过讲真eclipse是真难用,习惯了IDEA的快捷键和补全的同学建议在赛前复习一下eclipse的使用。
下面和大家分享一下两道最简单的(我是这么认为的)填空题题解。
试题A:阶乘求和
问题描述
令 S = 1! + 2! + 3! + … + 202320232023!,求 S 的末尾 9 位数字。
提示:答案首位不为 0。
答案提交
这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。
看到这题的数据就秒想到BigInteger,奈何在考场上已经忘了BigInteger的用法了。。。。。。。。我们当然不能直接算出S的最后结果并取余,那不仅爆long,甚至爆BigInteger了。。
第一种解法:
- public class A {
- //全局变量temp用于随时对大数取余
- static long temp=1000000000;
- public static void main(String[] args) {
- long sum=0;
- //尝试找出前100个数的阶乘和后就位是否有规律
- for (int i = 1; i <= 100; i++) {
- sum=(sum+digui(i))%temp;
- System.out.println(i+"的阶乘和为"+sum);
- }
- }
- public static long digui(long a){
- if(a==0 || a==1){
- return 1;
- }
- //在考虑此阶乘可能爆long的同时也要考虑前阶乘数*此数也有爆long的可能性
- return ((digui(a-1)%temp)*a)%temp;
- }
- }
最后我们发现:
- 1的阶乘和为1
- 2的阶乘和为3
- 3的阶乘和为9
- 4的阶乘和为33
- 5的阶乘和为153
- 6的阶乘和为873
- 7的阶乘和为5913
- 8的阶乘和为46233
- 9的阶乘和为409113
- 10的阶乘和为4037913
- 11的阶乘和为43954713
- 12的阶乘和为522956313
- 13的阶乘和为749977113
- 14的阶乘和为928268313
- 15的阶乘和为602636313
- 16的阶乘和为392524313
- 17的阶乘和为820620313
- 18的阶乘和为526348313
- 19的阶乘和为935180313
- 20的阶乘和为111820313
- 21的阶乘和为821260313
- 22的阶乘和为428940313
- 23的阶乘和为405580313
- 24的阶乘和为844940313
- 25的阶乘和为828940313
- 26的阶乘和为412940313
- 27的阶乘和为180940313
- 28的阶乘和为684940313
- 29的阶乘和为300940313
- 30的阶乘和为780940313
- 31的阶乘和为660940313
- 32的阶乘和为820940313
- 33的阶乘和为100940313
- 34的阶乘和为620940313
- 35的阶乘和为820940313
- 36的阶乘和为20940313
- 37的阶乘和为420940313
- 38的阶乘和为620940313
- 39的阶乘和为420940313
- 40的阶乘和为420940313
- 41的阶乘和为420940313
- 42的阶乘和为420940313
- 43的阶乘和为420940313
- 44的阶乘和为420940313
- 45的阶乘和为420940313
- 46的阶乘和为420940313
- 47的阶乘和为420940313
- 48的阶乘和为420940313
- 49的阶乘和为420940313
- 50的阶乘和为420940313
39及以后数字的阶乘和后九位均为420940313,所以最终答案就是420940313。
第二种解法(直接开BigInteger)
- import java.math.BigInteger;
-
- public class A {
- public static void main(String[] args) {
- BigInteger a = new BigInteger("1");
- BigInteger ans = new BigInteger("0");
- for (int i = 1; i <= 50; i++) {
- a = a.multiply(new BigInteger("" + i));
- ans = ans.add(a);
- System.out.println(i + "的阶乘和后9位为" + ans.mod(new BigInteger("1000000000")));
- }
- }
- }
试题B:幸运数字
问题描述
哈沙德数是指在某个固定的进位制当中,可以被各位数字之和整除的正整数。例如 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 个幸运数字是多少?你只需要告诉小蓝这个整数的十进制表示即可。
答案提交
这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。
这道题考察的是进制转换,会调用API就可以。
十进制转二进制:Integer.toBinaryString(i)
十进制转八进制:Integer.toOctalString(i)
十进制转十六进制:Integer.toHexString(i)
当然也可以用
Integer.toString(n,2)
Integer.toString(n,8)
Integer.toString(n,16)
- public class B {
- public static void main(String[] args) {
- int count = 0;
- int index = 1;
- while (true) {
- String s2 = Integer.toBinaryString(index);//转换二进制
- String s8 = Integer.toOctalString(index);//转换八进制
- String s16 = Integer.toHexString(index);//转换十六进制
- //判断是否都能整除(不要忘了自己本身)
- if (index % getSum(s2) == 0 && index % getSum(s8) == 0 && index % getSum(s16) == 0 && index % getSum("" + index) == 0) {
- count++;
- }
- if (count == 2023) {
- System.out.println("第2023个幸运数字是" + index);
- break;
- }
- index++;
- }
- }
-
- public static int getSum(String str) {
- int sum = 0;
- char chars[] = str.toCharArray();
- //在转十六进制时需要注意对字母的处理
- for (int i = 0; i < chars.length; i++) {
- if (chars[i] >= 'a' && chars[i] <= 'f') {
- sum += (chars[i] - 'a' + 10);
- } else {
- sum += chars[i] - '0';
- }
- }
- return sum;
- }
- }
希望本章能对大家有所帮助~
如有错误,欢迎评论区指正!!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。