A:阶乘求和
【问题描述】
令S = 1! + 2! + 3! + ...... + 202320232023!,求S的末尾9个数字。
提示:答案首位不为0。
毫无疑问,阶乘的结果非常非常大更不要说再相加,但只要最后9位数字,我们直接截取就可以了。
// 这个代码有点问题
// public class Main {
// public static void main(String[] args) {
// long sum = 0;
// for(long i = 1; i < 2023L; i++) {
// sum += f(i);
// while(sum / 1000000000 > 0) {
// sum = sum % 1000000000;
// }
// }
// System.out.println(sum);
// }
//
// // 计算阶乘
// private static long f(long n) {
// long res = 1;
// for(long i = 1; i < n; i++) {
// res *= i;
// while(res / 1000000000 > 0) {
// res = res % 1000000000;
// }
// }
// return res;
// }
//}
public class Main {
public static void main(String[] args) {
// cal(40);// 815915283247897734345611269596115894272000000000
cal();
}
public static void cal() {
BigInteger bigInteger2 = BigInteger.valueOf(0);
for (int n = 1; n <= 40; n++) {
BigInteger bigInteger = new BigInteger("1");
for (int i = 1; i <= n; i++) {
bigInteger = bigInteger.multiply(new BigInteger(i + ""));
}
bigInteger2 = bigInteger2.add(bigInteger);
}
System.out.println(bigInteger2.toString());// 836850334330315506193242641144055892504420940313
}
}
这么大的阶乘没必要全算,因为阶乘乘到最后,起码最后9位全部为0。只要计算之前一部分阶乘的和即可。
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个幸运数字是多少?你只需要告诉小蓝这个整数的十进制表示即可。
上代码:
public class Main {
public static void main(String[] args) {
int sum = 0;
for (int i = 1; i < 600000; i++) {
if (binaryJudgment(i) && octalJudgment(i) && decimalJudgment(i) && hexadecimalJudgment(i)) {
sum++;
}
if (sum == 2023) {
System.out.println(i);
return;
}
}
}
public static boolean binaryJudgment(int i) {
// 注意这样做会报错:
// Exception in thread "main" java.lang.NumberFormatException: For input string: "10000000000"(就是已经超出int范围了)
// String m = Integer.toString(i, 2);
// int mm = Integer.parseInt(m);
// 将十进制数转换为二进制
String binary = Integer.toBinaryString(i);
int sum = 0;
// 遍历二进制每一位并相加
for (char c : binary.toCharArray()) {
sum += Character.getNumericValue(c);
}
// 如果十进制数对二进制每一位相加的和取余等于 0,返回 true,否则返回 false
return i % sum == 0;
}
public static boolean octalJudgment(int i) {
int octalSum = 0;
// 将十进制数转换为八进制字符串
int octal = Integer.parseInt(Integer.toString(i, 8));
// 计算每一位八进制数字之和
while (octal > 0) {
octalSum += octal % 10;
octal /= 10;
}
// 判断是否能被八进制数字之和整除
return (i % octalSum == 0);
}
public static boolean decimalJudgment(int i) {
int temp = i;
int sum = 0;
while (i > 0) {
sum += i % 10;
i /= 10;
}
if(temp % sum == 0) {
return true;
} else {
return false;
}
}
public static boolean hexadecimalJudgment(int i) {
// 将十进制数转换为十六进制字符串
String hexString = Integer.toHexString(i);
int sum = 0;
// 计算每一位十六进制数字之和
for (char c : hexString.toCharArray()) {
sum += Character.digit(c, 16);
}
// 判断是否能被十六进制数字之和整除
return i % sum == 0;
}
}
所以有人要问了,答案是多少呢?
你做对了吗?
剩余题目持续更新,喜欢就点个👍支持一下吧!