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

目录

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

解法

思路

高级思路

总结


题目链接: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 {
     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下所有位上数字之和的。

整个流程是这样的:

  1. 初始化ans为0,这个变量用来存储x在特定进制下所有位上数字之和。

  2. 进入while循环,只要x大于0,就一直执行循环。

  3. 在每次循环中,xmod取余(即 x % mod),这相当于得到xmod进制下的最低位。根据余数定理和我们的进制制度,当一个数对某个进制进行取余操作时,得到的余数就是该数在这种进制下的最低位。(大家可以回想一下自己求十进制数的个位的时候是不是就是这个操作

  4. 把取得的最低位加到ans里,ans在循环过程中始终记录了xmod进制下所有已经处理过的位的和。

  5. 然后用 x除以mod(即 x / mod),结果赋值给x,这相当于把xmod进制下的最低位去掉。再次运用余数定理和我们的进制制度,当一个数被某个进制的数除时,结果就是这个数在这种进制下去掉最低位的部分。

  6. 这个循环反复执行,直到x小于等于0,也就是我们说的x已经没有剩下位数要处理。

        所以这个while循环的作用就是,将一个给定的数x在给定的进制mod下的所有位上的数字全部加起来,结果存放在ans中。

        我只能说天才

        所以说,这段代码的功能就是找出第2023个在2、8、10、16进制下都是哈希德数的数字。

public class Main {
    public static void main(String[] args) {
      int cnt = 0;
      for(int i=1; ; i++){
          if(check(i, 2) && check(i, 8) && check(i, 10) && check(i, 16)) cnt++;
          if(cnt == 2023){
             System.out.println(i);
             break;
          }
      }
      
    }

    //判断是否为mod进制下的哈沙德数
    public static boolean check(int x, int mod){
      int n = x;
      int ans = 0;
      while(x>0){
        ans = ans+ x%mod;
        x /= mod;
      }
      return n%ans==0;
    }
}

总结

大佬就是大佬,蓝桥杯四个小时,这道题我写了一个小时,我已经废了

再见

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/464568.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

每日一题——LeetCode2789.合并后数组中的最大元素

方法一 倒序遍历&#xff1a; 将数组倒序过来看&#xff0c;就是从最后一个数开始&#xff0c;如果它前面一个数小于等于它就可以把前面一个数吃掉同时加上前一个数的值形成一个新的数&#xff0c;如果碰到一个更大的数就吃不动了&#xff0c;那么就换那个更大的数去继续吃前面…

API接口:获取歌曲、小姐姐图片以及视频

文章目录 前言一、成果展示二、接口演示 1、歌曲2、图片和视频三、创造难点四、总结 前言 上次利用QQ音乐官网做了一个根据qq号获取暗恋人喜欢的歌单以及收藏歌曲&#xff0c;但是感觉功能还是太单薄了&#xff0c;于是我再次利用网上提供的免费API接口补充了一些功能。 一、成…

数据库精通之路:国产GBASE数据库学习网站全攻略

介绍&#xff1a;GBASE是一个包含多种产品的数据库系列&#xff0c;由南大通用数据技术有限公司推出&#xff0c;以其高性能和高可用性在国内数据库市场享有较高的品牌知名度。以下是GBASE系列的主要产品特点&#xff1a; GBase 8a&#xff1a;这是一个面向大数据分析的高性能数…

Unload-labs-pass-03

这里是设置了黑名单不能传.asp.aspx.php.jsp文件 $is_upload false; $msg null; if (isset($_POST[submit])) {if (file_exists(UPLOAD_PATH)) {$deny_ext array(.asp,.aspx,.php,.jsp);$file_name trim($_FILES[upload_file][name]);$file_name deldot($file_name);//删…

vue2+vant2+Laravel7 实现多图上传到七牛云

后端接口 1、路由&#xff0c;在 routes/api.php 中 Route::resource(photos, PhotoController)->only(store);2、创建对应控制器 <?php namespace App\Http\Controllers; use Illuminate\Http\Request;class PhotoController extends Controller {/**** 上传图片* p…

LangChain: 调研报告

概述 LangChain是一个用于开发由语言模型驱动的应用程序的框架。它允许创建能够连接到上下文源&#xff08;如提示指令、少量示例、内容基础等&#xff09;的应用程序&#xff0c;并且能够进行推理&#xff08;基于提供的上下文如何回答问题、采取何种行动等&#xff09;。提供…

最佳实践:Postman 怎么调试 WebSocket

WebSocket 是一个支持双向通信的网络协议&#xff0c;它在实时性和效率方面具有很大的优势。Postman 是一个流行的 API 开发工具&#xff0c;它提供了许多功能来测试和调试 RESTful API 接口&#xff0c;最新的版本也支持 WebSocket 接口的调试。想要学习更多关于 Postman 的知…

力扣24. 两两交换链表中的节点

新建虚拟头节点&#xff0c;用3个指针记录前3个节点&#xff0c;然后再相互赋值指向&#xff0c;再移动当前节点&#xff0c;当前节点所在的位置&#xff0c;只能交换该节点的后两个节点&#xff08;所以必须建立虚拟头节点&#xff0c;才能操作第1&#xff0c;2个节点&#xf…

机器学习——压缩网络作业

文章目录 任务描述介绍知识蒸馏网络设计 Baseline实践 任务描述 网络压缩&#xff1a;使用小模型模拟大模型的预测/准确性。在这个任务中&#xff0c;需要训练一个非常小的模型来完成HW3&#xff0c;即在food-11数据集上进行分类。 介绍 有许多种网络/模型压缩的类型&#xff0…

【静夜思】为什么我们会如此喜欢夜晚呢

作为一名大学生&#xff0c;熬夜对我来说已是常态。每天都是近乎一点钟才有困意&#xff0c;觉得应该上床睡觉了&#xff0c;即使明天早八&#xff0c;即使明天有很多课。我也观察过身边的朋友&#xff0c;他们中大多数也和我一样&#xff0c;基本都是在12点过后才入睡。当今的…

AIGC笔记--关节点6D位姿按比例融合

1--核心代码 6D位姿一般指平移向量和旋转向量&#xff0c;Maya软件中关节点的6D位姿指的是相对平移向量和欧拉旋转向量&#xff1b; 为了按比例融合两个Pose&#xff0c;首先需要将欧拉旋转向量转换为旋转矩阵&#xff0c;在将旋转矩阵转换为四元数&#xff0c;利用球面线性插值…

指针 六 ---总结

文章目录 前言1.指针和指针变量2.const修饰2.1.const int* p 修饰的是指针指向的内容&#xff0c;保证指针指向的内容不能通过指针来改变。但是指针变量本⾝的内容可变。2.2 int const *p2.3 int *const p2.4 const int* const p 3. 指针数组&#xff08;array of pointers&…

彻底学会系列:一、机器学习之梯度下降(1)

1 梯度下降概念 1.1 概念 梯度下降是一种优化算法&#xff0c;用于最小化一个函数的值&#xff0c;特别是用于训练机器学习模型中的参数&#xff0c;其基本思想是通过不断迭代调整参数的值&#xff0c;使得函数值沿着梯度的反方向逐渐减小&#xff0c;直至达到局部或全局最小…

如何在webapp中手动部署

前言&#xff1a;这个有不知道怎么下载Tomcat的可以看我这篇博客的前面&#xff0c;有相关链接&#xff0c;下载好后我那边也有如何运行成功的 在idea中配置tomcat服务器&#xff0c;部署一个项目-CSDN博客 接下来进入这篇博客的正题&#xff01;怎么手动部署 先找到我们下载…

java.lang.NoSuchMethodException异常解决

标题 java.lang.NoSuchMethodException异常的正确解决方法摘要&#x1f680; 异常介绍&#x1f9d0; 异常原因分析&#x1f6e0; 解决方法核对方法名称和参数使用正确的方法签名调整方法访问权限 &#x1f4dd; 解决步骤详解&#x1f5a5; 代码案例演示❓ QA部分Q: 如何区分jav…

Linux环境开发工具之yum

前言 前面我们已经对基本的指令和权限进行了介绍&#xff0c;本期开始我们将介绍常用的开发工具。例如&#xff1a;软件包管理器yum。 本期内容介绍 Linux上安装软件的方式 什么是yum yum的相关操作 yum的本地配置和yum源 一、Linux上安装软件的方式 在介绍Linux上如何安装一…

uboot的移植——移植uboot官方的uboot到x210开发板(2)

以下内容源于朱有鹏嵌入式课程的学习与整理&#xff0c;如有侵权请告知删除。 参考内容 1、uboot的移植——移植uboot官方的uboot到x210开发板&#xff08;1&#xff09; 2、uboot启动流程——C阶段的start_armboot函数-CSDN博客 3、以官方uboot移植uboot(SD卡驱动移植)-CSDN博…

Linux 块设备驱动

Linux 三大驱动分别是&#xff1a;字符设备驱动、块设备驱动、网络设备驱动。 块设备是针对存储设备的&#xff0c;比如 SD 卡、EMMC、NAND Flash、Nor Flash、SPI Flash、机械硬盘、固态硬盘等。因此块设备驱动其实就是这些存储设备驱动&#xff0c;块设备驱动相比字符设备驱…

【洞察】区块链、web3、元宇宙等技术共同催生出了什么样的商业未来?

下文为中国信息通信研究院云计算与大数据研究所所长何宝宏为思二勋所著的《分布式商业生态战略&#xff1a;数字商业新逻辑与企业数字化转型新策略》一书所作的推荐序。 近两年来&#xff0c;区块链已从鲜为人知发展到尽人皆知且众说纷纭&#xff0c;从产业初期的静默发展到产…

若你有才能,最好能遇上识才之人,高俅发迹的故事很好诠释了千里马与伯乐的关系

若你有才能&#xff0c;最好能遇上识才之人&#xff0c;高俅发迹的故事很好诠释了千里马与伯乐的关系 其实&#xff0c;“千里马”和“伯乐”都是中国古代传说里的角色。伯乐是古代一个善于相马&#xff08;识别马的好坏&#xff09;的人&#xff0c;而“千里马”则是指一匹能跑…