2023蓝桥杯javaB部分题解

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。只要计算之前一部分阶乘的和即可。

1

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;
	}
}

       所以有人要问了,答案是多少呢?

你做对了吗?

剩余题目持续更新,喜欢就点个👍支持一下吧!

  • 4
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值