目录
试题 A: 阶乘求和
本题总分:5 分
【问题描述】
令 S = 1! + 2! + 3! + ... + 202320232023!,求 S 的末尾 9 位数字。 提示:答案首位不为 0。
【答案提交】
这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一 个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。
思路:看见 202320232023! 妈耶,太大了!
直接 BigInteger
public class Test2 {
public static void main(String[] args) {
// 初始化变量
BigInteger num = new BigInteger("1"); // num用于存储每次计算的结果
BigInteger ad = new BigInteger("1"); // ad用于存储每次计算的底数
BigInteger sum = new BigInteger("0"); // sum用于存储所有计算结果的和
BigInteger m = new BigInteger("1000000000"); // m用于存储模数
// 循环计算
for (int j = 1; j <= 320232023; j++) {
num=num.multiply(ad).mod(m); // 计算num
ad=ad.add(new BigInteger("1")); // 更新ad
sum=sum.add(num).mod(m); // 更新sum
}
System.out.println(sum); // 输出结果
}
}
420940313
之所以取值范围用:320232023 而不是:202320232023
原因【你们细品】:
故此:
试题 B: 幸运数字
本题总分:5 分
【问题描述】
哈沙德数是指在某个固定的进位制当中,可以被各位数字之和整除的正整 数。例如 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 个幸运数 字是多少?你只需要告诉小蓝这个整数的十进制表示即可。
【答案提交】
这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一 个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。
public class Test {
public static void main(String[] args) {
int cnt=0;
// 循环1到999999
for (int num = 1; num <= 999999; num++) {
// 将num转换为二进制、八进制、十六进制字符串
String n2 = Integer.toBinaryString(num);
String n8 = Integer.toOctalString(num);
String n10=num+"";
String n16 = Integer.toHexString(num);
// 如果满足四种进制下各位数字之和能整除num
if(checkn2(n2,num)&&checkn8(n8,num)&&checkn10(n10,num)&&checkn16(n16,num)){
cnt++;
// 如果是第2023个满足条件的数,输出
if (cnt==2023)System.out.println(num);
}
}
}
// 检查十六进制下各位数字之和能否整除num
private static boolean checkn16(String n16, int num) {
int sum=0;
for (int i = 0; i < n16.length() ;i++) {
// 如果是a~f,转换为10~15
if (n16.charAt(i)=='a'){
sum+=10;
continue;
}
if (n16.charAt(i)=='b'){
sum+=11;
continue;
}
if (n16.charAt(i)=='c'){
sum+=12;
continue;
}
if (n16.charAt(i)=='d'){
sum+=13;
continue;
}
if (n16.charAt(i)=='e'){
sum+=14;
continue;
}
if (n16.charAt(i)=='f'){
sum+=15;
continue;
}
// 如果是数字,转换为int类型并加到sum上
sum+=n16.charAt(i)-'0';
}
// 如果sum能整除num,返回true,否则返回false
if (num%sum==0){
return true;
}
return false;
}
// 检查十进制下各位数字之和能否整除num
private static boolean checkn10(String n10, int num) {
int sum=0;
for (int i = 0; i <n10.length() ; i++) {
// 将数字字符转换为int类型并加到sum上
sum+=n10.charAt(i)-'0';
}
// 如果sum能整除num,返回true,否则返回false
if (num%sum==0){
return true;
}
return false;
}
// 检查八进制下各位数字之和能否整除num
private static boolean checkn8(String n8, int num) {
int sum=0;
for (int i = 0; i <n8.length() ; i++) {
// 将数字字符转换为int类型并加到sum上
sum+=n8.charAt(i)-'0';
}
// 如果sum能整除num,返回true,否则返回false
if (num%sum==0){
return true;
}
return false;
}
// 检查二进制下各位数字之和能否整除num
private static boolean checkn2(String n2, int num) {
int sum=0;
for (int i = 0; i <n2.length() ; i++) {
// 将数字字符转换为int类型并加到sum上
sum+=n2.charAt(i)-'0';
}
// 如果sum能整除num,返回true,否则返回false
if (num%sum==0){
return true;
}
return false;
}
}
215040
试题 C: 数组分割
晚点更新
试题 D: 矩形总面积
时间限制: 1.0s 内存限制: 512.0MB 本题总分:10 分
【问题描述】
平面上有个两个矩形 R1 和 R2,它们各边都与坐标轴平行。设 (x1, y1) 和
(x2, y2) 依次是 R1 的左下角和右上角坐标,(x3, y3) 和 (x4, y4) 依次是 R2 的左下 角和右上角坐标,请你计算 R1 和 R2 的总面积是多少? 注意:如果 R1 和 R2 有重叠区域,重叠区域的面积只计算一次。
【输入格式】
输入只有一行,包含 8 个整数,依次是:x1,y1,x2,y2,x3,y3,x4 和 y4。
【输出格式】
一个整数,代表答案。
【样例输入】
2 1 7 4 5 3 8 6
【样例输出】
22
【样例说明】
样例中的两个矩形如图所示:
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int x1 = sc.nextInt(); // 输入第一个矩形左下角的横坐标
int y1 = sc.nextInt(); // 输入第一个矩形左下角的纵坐标
int x2 = sc.nextInt(); // 输入第一个矩形右上角的横坐标
int y2 = sc.nextInt(); // 输入第一个矩形右上角的纵坐标
int x3 = sc.nextInt(); // 输入第二个矩形左下角的横坐标
int y3 = sc.nextInt(); // 输入第二个矩形左下角的纵坐标
int x4 = sc.nextInt(); // 输入第二个矩形右上角的横坐标
int y4 = sc.nextInt(); // 输入第二个矩形右上角的纵坐标
int area1 = (x2 - x1) * (y2 - y1); // 计算第一个矩形的面积
int area2 = (x4 - x3) * (y4 - y3); // 计算第二个矩形的面积
int overlapWidth = Math.min(x2, x4) - Math.max(x1, x3); // 重叠部分的宽度
int overlapHeight = Math.min(y2, y4) - Math.max(y1, y3); // 重叠部分的高度
int overlapArea = Math.max(overlapWidth, 0) * Math.max(overlapHeight, 0); // 重叠部分的面积
int totalArea = area1 + area2 - overlapArea; // 总面积
System.out.println(totalArea); // 输出总面积
}
2 1 7 4 5 3 8 6
22
我的答案可能存在错误或不够准确,请您谅解。如果您有任何疑问或者发现错误的地方,欢迎指出,我会尽力改正。