JAVA B组题目下载链接
试题 A: 阶乘求和
令 S = 1! + 2! + 3! + … + 202320232023! 求 S 的末尾 9 位数字。
本题目的核心思想与2022年JAVAB组第五题思想一致
核心就是阶乘大到一定地步时,末尾会出现很多0,所以说求最后九位数并不需要将S算出来,只需要算到至多55的时候就能观察到最后九位是不变的
如果纯暴力算的话,我在场上跑了一个小时,根本跑不完
package lanqiao2023;
import java.math.BigInteger;
public class A {
public static void main(String[] args) {
BigInteger i = new BigInteger("1");
BigInteger end = new BigInteger("55");
BigInteger temp = new BigInteger("1");
BigInteger s = new BigInteger("0");
while (i.compareTo(end)<=0){
temp = temp.multiply(i);
s = s.add(temp);
i = i.add(BigInteger.ONE);
System.out.println(s);
}
}
}
试题 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 个幸运数字是多少?你只需要告诉小蓝这个整数的十进制表示即可。
这道题相对较为简单,只需要掌握一个求各进制下每位数和的方法即可
这个方法的思路就是对n取模,取出n进制下的最后一位,累加到s上,然后再让x除以n,让它的最后一位消失
public static int check(int x,int n){//x代表数,n代表进制
int s = 0;
while (x/n>0){
int a = x%n;
s = s+a;
x = x/n;
}
return x+s;
}
主方法内调用即可
package lanqiao2023;
public class B {
public static int check(int x,int n){
int s = 0;
while (x/n>0){
int a = x%n;
s = s+a;
x = x/n;
}
return x+s;
}
public static void main(String[] args) {
int ans = 1;
int i =1;
while (ans<=2023){
if(i%check(i,2)==0&&i%check(i,8)==0&&i%check(i,10)==0&&i%check(i,16)==0){
System.out.println(ans+" "+i);
ans++;
}
i++;
}
}
}