首页 > 其他分享 >2023年蓝桥杯省赛——幸运数字

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

时间:2024-03-17 18:04:31浏览次数:28  
标签:进制 2023 整数 蓝桥 ans 省赛 check mod

目录

题目链接: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;
    }
}

总结

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

再见

标签:进制,2023,整数,蓝桥,ans,省赛,check,mod
From: https://blog.csdn.net/DDDDWJDDDD/article/details/136781307

相关文章

  • 2023年蓝桥杯模拟省赛——列名
    目录题目链接:2.列名-蓝桥云课(lanqiao.cn)思路高级思路:进制转换难点一难点二难点三总结题目链接:2.列名-蓝桥云课(lanqiao.cn)思路先来看我的暴力的思路吧主要有以下步骤:初始化一个长度为3的数组res用于存放结果,并且定义一个变量 p 表示目前数组中的......
  • 蓝桥杯单片机PCF8951数模转换测光敏电阻和滑动变阻器
    无论怎么调试,数码管只显示000,让人非常苦恼。下面是代码,请各位大佬指点>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>这是main函数/*头文件声明区*/#include<STC15F2K60S2.H>......
  • 2023性能测试工作积累
    一 理论1、性能调优思路:性能瓶颈点分析、关键参数调整、sql调优。调优过程中,通过系统资源、吞吐量、负载等因素来辅助分析。性能调优流程: 确定调优范围:服务器CPU、内存、IO、网络是否已被充分利用,是否存在瓶颈点。 系统调优:目的是充分利用服务器资源,避免资源冲突,提升吞吐量......
  • 沃伦·巴菲特2023股东书(2024.2.24)-0-查理·芒格——伯克希尔·哈撒韦公司的建筑师
    2023letterhttps://www.berkshirehathaway.com/letters/2023ltr.pdf查理·芒格——伯克希尔·哈撒韦公司的建筑师查理·芒格于11月28日去世,距离他100岁生日仅33天。虽然在奥马哈出生和长大,但他一生中80%的时间都在其他地方定居。因此,直到1959年他35岁时,我才第一次......
  • IntelliJ IDEA 2023.3 最新发布啦!盘点精彩亮点(关注公众号‘精品应用分享’,输入'idea'
    IntelliJIDEA2023.3的发布标志着AIAssistant的持续发展,它现已超越技术预览阶段,并具有许多令人兴奋的改进。在其他领域,该版本包括对最新Java21功能的全面支持,引入了具有编辑操作的直观浮动工具栏,并添加了“运行到光标”嵌入选项以增强调试工作流程。IntelliJIDEAUltima......
  • 【洛谷 P8661】[蓝桥杯 2018 省 B] 日志统计 题解(滑动窗口+优先队列+双端队列+集合)
    [蓝桥杯2018省B]日志统计题目描述小明维护着一个程序员论坛。现在他收集了一份“点赞”日志,日志共有NNN行。其中每一行的格式是tsid,表示在......
  • 【洛谷 P8602】[蓝桥杯 2013 省 A] 大臣的旅费 题解(图论+深度优先搜索+树的直径+链式
    [蓝桥杯2013省A]大臣的旅费题目描述很久以前,T王国空前繁荣。为了更好地管理国家,王国修建了大量的快速路,用于连接首都和王国内的各大城市。为节省经费,T国的大臣们经过思考,制定了一套优秀的修建方案,使得任何一个大城市都能从首都直接或者通过其他大城市间接到达。同......
  • 20231325贾罗祁 2023-2024-2《Python程序设计》实验一报告
    20231325贾罗祁2023-2024-2《Python程序设计》实验一报告课程:《Python程序设计》班级:2313姓名:贾罗祁学号:20231325实验教师:王志强实验日期:2024年3月13日必修/选修:公选课1.实验内容熟悉Python的操作学会调试程序编译循环的剪刀石头布游戏创建gitee账户并推送上传......
  • 蓝桥杯单片机STC15F2K60S2第十三届省赛代码详细讲解(附完整代码)
     一、前言            在蓝桥杯单片机的比赛当中,很多传感器都是会经常使用到的,比如说DS18B20和DS1302等,都是会经常用到的,所以我们要把这些传感器都学会一下。在省十三的蓝桥杯单片机题目中,我自己也写了一下这个代码,可能有些地方会有点问题,但是大致的功能还是能......
  • 蓝桥杯算法集训 - Week 2:双指针、归并排序、多路归并
    蓝桥杯算法集训-Week2本系列随笔用于整理AcWing题单——《蓝桥杯集训·每日一题2024》的系列题型及其对应的算法模板。一、双指针Ⅰ、代码模板常见问题分类:(1)对于一个序列,用两个指针维护一段区间(2)对于两个序列,维护某种次序,比如归并排序中合并两个有序序列的操作f......