首页 > 其他分享 >2023年蓝桥杯模拟省赛——列名

2023年蓝桥杯模拟省赛——列名

时间:2024-03-17 18:00:02浏览次数:29  
标签:25 26 转换 进制 -- res 蓝桥 2023 省赛

目录

题目链接:2.列名 - 蓝桥云课 (lanqiao.cn)

思路

高级思路:进制转换

难点一

难点二

难点三

总结


题目链接:2.列名 - 蓝桥云课 (lanqiao.cn)

思路

先来看我的暴力的思路吧

主要有以下步骤:

  1. 初始化一个长度为3的数组res用于存放结果,并且定义一个变量 表示目前数组中的有效长度 - 1(即当前操作的位置)。变量p的初始值为0,表示当前数组的有效长度为1。

  2. 通过一个for循环生成2022次操作。操作主要分为两步:

    第一步,判断当前数组中所有有效元素是否全部为26。如果是,就将数组的所有有效元素都重置为1,并且扩大数组的有效长度1位(即p加1)。

    第二步,将有效位置(p位置)的元素加1。若此元素达到26,将该元素归零,并令前一个元素加1。若前一个元素也达到26,则会连带影响到再前一个元素,依此类推。

  3. 当循环完成2022次 after 操作后,我们会得到一个长度为3的数组,该数组中的元素值在1至26之间,可映射为字母序列。

        这段代码就是通过特定的规则,生成一个特殊的字母序列。这个序列的特点是每个单词都不同,并且在字母顺序上是递增的。这个序列可以类比为一种自定义的26进制计数系统,每一位的取值范围是1-26,对应到字母就是A-Z,每次计数完成后,会在需要的时候往上进位。

package src;

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

public class Main {
	public static void main(String[] args) {
		// StreamTokenizer st = new StreamTokenizer(new BufferedReader(new
		// InputStreamReader(System.in)));

		int[] res = new int[] { 0, 0, 0 };
		int p = 0;
		for (int i = 0; i < 2022; i++) {
			// System.out.println(Arrays.toString(res));
			boolean flag = true;
			// 判断是否全部为 26
			for (int j = 0; j <= p; j++) {
				if (flag && res[j] != 26) {
					flag = false;
				}
			}
			// 是,那么就要加一位了
			if (flag) {
				for (int j = p; j >= 0; j--) {
					res[j] = 1;
				}
				p++;
			}

			if (p > 0 && res[p] == 26) {
				res[p] = 0;
				boolean flag2 = true;
				if (res[p - 1] == 25) {
					flag2 = false;
				}

				if (flag2 && p - 1 > 0 && res[p - 1] == 26) {
					res[p - 1] = 0;
					res[p - 2]++;
				}
				res[p - 1]++;
			}
			res[p]++;
		}
		// ABCDEFGHIJKLMNOPQRSTUVWXYZ
		// !                  !    !
		// System.out.println(Arrays.toString(res));
		
	}
}

虽然说麻烦了一点,但你就是说能不能写出来吧沃kao

 


高级思路:进制转换

import java.util.Scanner;
// 1:无需package
public class 列名 {
    public static void main(String[] args) {
        int n = 2022;
        String s = "";
        while (n > 0) {
            s = (char)(--n % 26 + 'A') + s;
            n /= 26;
        }
        System.out.println(s);
    }
}

是不是看起来很简单但是很*****™看不懂是吧

我来解释一波

难点一

为什么这个是实现了进制转换的操作

答:

        在计算机科学中,进制转换是一项常见的操作。对于整数,我们通常使用除法和取余操作来实现进制转换。

假设我们有一个十进制数 n,我们想把它转化为 b 进制数,那么我们可以按照以下步骤操作:

  1. 对 n 求余数(对 b 取模),得到的余数是新进制下的最低位。
  2. 对 n 进行整除操作(除以 b),得到的商用于下一轮计算。
  3. 重复步骤 1 和 2,直到商为 0。

        结果就是所有余数(即新进制下的数字)的序列,只不过这个序列是从低位到高位排列的,所以我们需要将它反向输出。

        举个例子,把十进制的13转换为二进制:

  1. 13 % 2 = 1,13 / 2 = 6
  2. 6 % 2 = 0 ,  6 / 2 = 3
  3. 3 % 2 = 1,  3 / 2 = 1
  4. 1 % 2 = 1,  1 / 2 = 0

所以,13在二进制下的表示就是1101。

        在这个代码中,n模26得到的余数表示的是26进制下的某一位,然后除以26得到的商作为下一次计算的基数。所以这就是一个将十进制转换为26进制的过程。

难点二

为什么这里使用的是 --n 而不是 n--

        在这段代码中,"--n"是先减1再进行后续操作,原因在于我们把'A'到'Z'视为1到26,而非0到25。所以需要先减1来把范围转变为0到25,这样才能利用(char) (n % 26 + 'A')把0-25映射到'A'-'Z'。

        假设你使用“n--”,那么当n=26时,模26的结果为0,转换为字符得到的是'A'-1,这并不是我们想要的结果。所以我们需要先减1,使得n在被模之前就已经减1,这样我们在对模26的结果进行字符转换时得到的就是我们期望的结果。

        总的来说,“--n”是为了把'A'-'Z'对应到1-26而不是0-25,它确保了当n是26的倍数(如26, 52等)时,我们得到的结果是'Z'而不是'Y'。

        另一方面,对于“n--”和“--n”在循环体内的有无区别的问题,实际上在循环体内,“n--”和“--n”的区别只在于他们的值是在执行这条语句之后还是之前改变的。

难点三

你怎么知道可以使用进制转换,为毛啊!!!愤(•́へ•́╬)

        这题的本质在于对给定的十进制数字进行一个从1到26的映射,而这个映射在某种程度上就像是在做进制转换,具体来说,就是把十进制转换为26进制。

        为什么说它像进制转换呢? 因为在任意进制系统中,每增1,最低位就会+1,若已经达到该位可表示的最大值,那么就归0并使得上一位+1,这和在1到26之间映射的操作是一致的(如在十进制中,个位9加1后变为0,十位加1。在二进制中,1加1后变为10,个位由1变为0,并进一位到十位)。所以,我们可以把这道题视为一个进制转换问题来解决。

        在这道题中,我们假设'A'-'Z'分别表示1-26,那么给定一个十进制数n,n模26就得到26进制下的一个"数字",赋予它字符表示就等同于赋值字母'A'-'Z'。因为26进制数的每一位数都在0-25之间,但我们需要的是0-25所对应的'A'-'Z',所以在模操作前我们需要减1,使得能够正确匹配。

        之所以我们可以这样解决这道题,就是因为这道题的要求和进制转换的特性高度吻合,这种解法也能很好地满足题目的要求。

        而且这也算是一个模版类型,大家可以好好的记住哦!!!

总结

牛,继续加油!!!

但是还是要多看看,以免忘记

标签:25,26,转换,进制,--,res,蓝桥,2023,省赛
From: https://blog.csdn.net/DDDDWJDDDD/article/details/136785883

相关文章

  • 蓝桥杯单片机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......
  • 会议室预约系统优化(蓝桥杯)
    文章目录会议室预约系统优化问题描述差分会议室预约系统优化问题描述假设你是一家大型企业的IT工程师,企业内有n个会议室,每天都有多个部门预约会议室进行会议。你的任务是优化现有的会议室预约系统。你需要设计一个程序来支持以下两种操作:预约会议室:给定一......