2024年蓝桥杯省赛——幸运数字

解法

思路

高级思路

总结


题目链接:0幸运数字 - 蓝桥云课 (lanqiao.cn)")

解法

首先是我写了差不多一个小时的解法,裂开了,为什么我如此废物

思路

寻找第2023个在二进制、八进制、十进制和十六进制表示下都为哈希德数的整数

在main函数中通过一个while循环来遍历所有的整数,直到找到第2023个满足条件的整数。position变量用于记录已经找到多少个满足条件的整数。

在每次循环中,首先通过调用getEachSum(i)函数计算整数i在十进制下各个位数之和。如果i不能被这个和整除,那么就继续检查下一个整数。

如果i能被这个和整除,那么就把i转换成二进制字符串,并计算字符串中所有字符(除去字符’0’)的数量,这也就是二进制下各位之和。再检查i是否能被这个和整除,如果不能,那么就继续检查下一个整数。

接着,把i转换成八进制的形式,然后用getEachSum(octal)计算这个八进制数的各位之和,并检查i是否能被这个和整除,如果不能,那么就继续下一个整数。

再然后,把i转换成十六进制字符串,并计算字符串中所有字符对应的数值之和。这一步中,有一个try…catch结构,这是因为十六进制数包括0-9和a-f两部分,对于a-f,用字符的阿斯奇码值减去’87’来得到对应的数值。再检查i能否被这个和整除,如不能,继续下一个整数。

如果i能被所有这些和整除,那么就意味着i在二进制、八进制、十进制和十六进制下都是哈希德数,于是就把它放入数组arr中,并使position加一,然后继续检查下一个整数。

getEachSum函数的作用是计算一个十进制数各位数之和,如果输入是非十进制的数,那么必须先将其转换为十进制。

一直到找到第2023个满足条件的整数,然后结束循环,输出这个整数。

是不是很流畅但是写的太复杂了,然后我去看了看其他大佬的题解,就发现了另一个结题思路

package src;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.StreamTokenizer;
import java.util.Arrays;
//1:无需package
//2: 类名必须Main, 不可修改

public class Main {
 public static void main(String[] args) throws IOException {
 

**真题解析、进阶学习笔记、最新讲解视频、实战项目源码、学习路线大纲**
**System.out.print(详情关注公中号:编程进阶路)**

    StreamTokenizer st = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));
     // 如果一个整数在二,八,十,十六进制下都可以被条件整除记录
     int position = 1;
     int i = 1;
     long res = -1;
     long[] arr = new long[2023];
     while (position <= 2023) {
    	long sum = getEachSum(i);
		boolean flag = true;
		// 判斷是否十进制符合
		if (i % sum != 0) {
			i++;
			continue;
		}
		// 判斷是否二进制符合
		String strBinary = Integer.toBinaryString(i);
		char[] binary = strBinary.toCharArray();
		sum = 0;
		for (char c : binary) {
			sum += c - 48;
		}
		if (i % sum != 0) {
			i++;
			continue;
		}
		
		// 判斷是否八进制符合
		long octal = Integer.parseInt(Integer.toOctalString(i));
		sum = getEachSum(octal);
		if (i % sum != 0) {
			i++;
			continue;
		}
		// 判斷是否十六进制符合  2a
		String strHex = Integer.toHexString(i);
		char[] strS = strHex.toCharArray();
		sum = 0;
		for (char c : strS) {
			try {
				sum += Integer.parseInt(c + "");
			} catch (Exception e) {
				// TODO: handle exception
				sum += c - 87;
			}
		}
		if (i % sum != 0) {
			i++;
			continue;
		}
		
		// 如果走到这里说明全部符合
		
		res = i;
		arr[position - 1] = res;
		position++;
		i++;
	}
     System.out.println(res);
 }
 
 public static long getEachSum(long num) {
	 long res = 0;
	while(num > 0) {
		long one = num % 10;
		res += one;
		num /= 10;
	}
	return res;
 }
}

通过这段不太聪明的代码之后就成功的跑出来了。


高级思路

main函数里首先,声明了一个计数变量cnt,设置初始值为0。接着,进入一个无限循环,每次循环都会将i(起始值为1)作为待检查的数字,
        然后,调用check函数检查这个数字在二进制、八进制、十进制和十六进制(也就是Mod 2, 8, 10 和 16)中是否都是哈希德数。 如果这个数字在所有这些进制下都是哈希德数,那么将计数变量cnt加1。 然后检查cnt是否等于2023,如果是,那么就输出当前的数字i并退出循环。如果不是,那么就将i增加1,并开始下一个循环,继续检查下一个数字。

重要的,高级的来哦了,check函数是用于检查一个数字在给定进制下是否是哈希德数的函数。它接受两个参数,x代表待检查的数字,mod代表要将x转换成哪种进制。函数内部,首先复制x的值给n保存,然后通过一个循环,计算转换为mod进制下的各位数值和ans。如果n可以被ans整除,那么就返回真(即该数在给定进制下是哈希德数),否则返回假。

我来特别解释一下check函数

check函数中,while循环是用来计算一个给定整数x在特定进制mod下所有位上数字之和的。

专业技能

一般来说,面试官会根据你的简历内容去提问,但是技术基础还有需要自己去准备分类,形成自己的知识体系的。简单列一下我自己遇到的一些题

最近得空把之前遇到的面试题做了一个整理,包括我本人自己去面试遇到的,还有其他人员去面试遇到的,还有网上刷到的,我都统一的整理了一下,希望对大家有用。

其中包含HTML、CSS、JavaScript、服务端与网络、Vue、浏览器等等

由于文章篇幅有限,仅展示部分内容

  • 15
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值