Java B组蓝桥杯第八届国赛:小计算器_蓝桥杯能不能用计算器

先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7

深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新网络安全全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
img
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上网络安全知识点,真正体系化!

需要体系化学习资料的朋友,可以加我V获取:vip204888 (备注网络安全)

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

需要这份系统化资料的朋友,可以点击这里获取

补充说明:

  1. n 值范围: 1<= n < 50000
  2. 初始默认的进制是十进制

资源约定:
峰值内存消耗 < 256M
CPU消耗  < 1000ms

请严格按要求输出,不要画蛇添足地打印类似:“请您输入…” 的多余内容。

所有代码放在同一个源文件中,调试通过后,拷贝提交该源码。
注意:不要使用package语句。不要使用jdk1.7及以上版本的特性。
注意:主类的名字必须是:Main,否则按无效代码处理。

这也不知道是哪位人才出的题,浪费我一天时间,各种测试,各种找其他博主的代码,(10个代码9个不通过,他们大多就是通过了样例,然后说这个题没啥难度,测试全是运行错误)终于找到一个c++的代码在网站上测试成功之后,开始努力看代码,强行把c++一对一换成java之后,又对比之前的代码找自己的出错的问题,终于测试通过了。(不想承认又不得不承认自己水平很低)

这一届国赛题看贴吧里有各种吐槽的,做个两道多就是国二。我发现这一年的题并不是很难,只是因为出题人语文太好,出的题目逻辑不通,几乎每道题都玩一些文字游戏,完全是看运气,谁能和出题人想到一块,谁就能很容易做出来。

下面说一下这个题目需要注意的地方,也是我疑惑的地方:

(1)题目的NUM指令参数X:“X为一个只包含大写字母和数字的字符串”,是类似“10AB43”这样的数。

由于样例输入也没给出特殊实例,谁能想到是类似“10AB43”这样的数,大写字母和数字掺杂,想想那些参赛的考生做题,还没法测试。没看出来这个点,这题就凉了。(我一开始以为是101B,4654O,329D,51H,类似这样的末尾带进制标识符,因为题目没有规定初始进制状态!!!),(不知道正在看这里的你有没有相同的感受,不会就我自己这么菜吧)

(2)题目的进制转换指令’CHANGE K’,(这里又是一个小坑,被我踩进去了),将当前进制转换为k进制。这句话没毛病,值得注意的是,整个程序中用到的进制,是同一个进制,不管是当前主数字的进制,还是运算时另外一个数字的进制,还是输出的进制,全都是一个进制,简单的来讲就是设置一个全局变量int通用就完事了。
(3)如果你已经会了上面两个点,那就可以来看第三个点:那个X,就是又含大写字母又含数字的X,它要参与计算首先得转成数字,那怎么转成数字呢?题目中已经告知了AZ代表1036,为了方便说明,我这里用上面提到的一个例子“10AB43”来解释。

正常人的思路会想到直接将A替换成10,B替换成11,得到10101143,看似没毛病,样例输入没有这样的例子,所以程序写成这样样例测试没毛病。

考试的话再一次凉凉,这道题一分没有。因为服务器系统测试里可不会有样例输入。废话好像扯太多了,抱歉,我今天太想吐槽。

哈哈,好了,言归正传,我们来看10AB43怎么换:

正确操作:不管是字符串,还是数字,它们每一个占一位,如果是大写字母对应两位数,但它们的权值是共用的,所以

结果 =  值 x  权值

我们从左往右开始分析每一位,为了方便我计算偷懒,咱就先假设当前的进制10进制。

1——>1x1e5=1x100000=100000

0——>0x1e4=0x10000=0

A——>10x1e3=10x1000=10000

B——>11x1e2=11x100=1100

4——>4x1e1=4x10=40

3——>3x1e0=3x1=3

最后加到一起10AB43——>111143,这时候在对比一下直接换字母的结果10101143,#%¥#%@#%¥&(我就问谁能想到…)

那如果你拥有了以上三点,可以来测试如下例子,应该是可以成功的。

蓝桥杯练题系统第一个测试

输入:

23
CLEAR
NUM 281659794
ADD
NUM 1722405514
MOD
NUM 660145688
EQUAL
DIV
NUM 19821154
MUL
NUM 922337202603578091
EQUAL
SUB
CHANGE 31
NUM ABO16DF
SUB
NUM 3LJI76O4
ADD
NUM 25RAC4GA
SUB
NUM IPA0SG0J
MOD
NUM 21Q75TT

输出

23628244
922337202603578091

(4)害,还有最后一点,就是重置命令CLEAR,说的是清除当前数字,就是不存在,是空的,程序里写的话就是不能用它参与下次计算,除非赋予新值。

我这坑又掉进去了,这题专门就适合坑我。如果单纯的将当前数字置0,置-1,那它就会参与下次计算的,然后就乱套了,0分走起…

这里有两个方式处理,在代码注释中解释了很详细,结合之后应该很容易理解。

测试网址:https://www.dotcpp.com/oj/problem1844.html

来看代码:

import java.util.Scanner;

public class Main {
	long num1 = 0;//主要参数
	long num2 = 0;//辅助计算的参数
	int jinzhi = 10;//进制默认10
	int op = 0;//运算操作,用数字代替字符串比较,简化操作,节约开销,不用也行
	public Main() {
		Scanner sn = new Scanner(System.in);
		int n = sn.nextInt();//n次
		//循环处理每条命令
		for (int i = 0; i < n; i++) {
			//把命令变成字符数组,简化字符串比较
			char[] s = sn.next().trim().toCharArray();
			if (s[0] == 'C' && s[1] == 'L') {
				/* 这里需要讲一下,重置指令,题目中描述清除当前的数字,就是不存在了,置空,不要置0或置-1
				 *.因为测试中有个坑,比如:ADD指令后接一个CLEAR
				 *.如果在这里简单的将当前数字置0,整个程序就乱套了,这个0会和一个数进行ADD运算
				 *.显然程序不会报错,但答案不对的
				 *.这里两种方式:一个是你真的把当前数字清除了,就是添加一个变量标记,表示当前数字无法使用
				 *.第二个就是把运算命令清除,显然这个运算命令不参与计算,改成不相关的任意值即可,我这里是置0
				 * */
				op=0;
			} else if (s[0] == 'N') {//给一个数
				//先换成10进制数
				long n1 = change_X_10(jinzhi, sn.next().trim());
				if (op!=0) {
					num2 = n1;// 赋给参与计算的第二个数
					calculate();//计算
				} else {
					num1 = n1;//赋给主要参数
				}
			} else if (s[0] == 'A') {//加
				op = 1;
			} else if (s[0] == 'S') {//减
				op = 2;
			} else if (s[0] == 'M' && s[1] == 'U') {//乘
				op = 3;
			} else if (s[0] == 'D') {//除
				op = 4;
			} else if (s[0] == 'M' && s[1] == 'O') {//余
				op = 5;
			} else if (s[0] == 'C' && s[1] == 'H') {//设置进制
				/*
				 * .可以看到这里只是简单的换了一下进制的参数,而没有对主要参数num1进行转换
				 * .因为对系统测试而言,他只看输出,因此在输出时,转一下进制给机器看。
				 * .对我们自己而言,全部用十进制更方便,不需要模拟进制转换进行计算,用了更麻烦,还没用
				 * 
				 */
				jinzhi = sn.nextInt();
			} else if (s[0] == 'E') {//输出,利用Long自带的进制转换
				System.out.println(Long.toString(num1,jinzhi));
			}
		}
		sn.close();
	}

	//计算
	public void calculate() {
		switch (op) {
		case 1:
			num1 += num2;
			break;
		case 2:
			num1 -= num2;
			break;
		case 3:
			num1 *= num2;
			break;
		case 4:
			num1 /= num2;
			break;
		case 5:
			num1 %= num2;
			break;
		default:
			break;
		}
		op = 0;
	}
/*
 *. 例:10AB43
 * 100000
 * 00000
 * 10000
 * 1100
 * 40
 * 3
 * 111143
 * 
 * */
	//将任意进制转换成10进制
	public long change_X_10(int j, String s) {
		long n1 = 0;
		int l=s.length();
		//遍历每一位
		for (int i = l - 1; i >= 0; i--) {
			long n2 = 1;
			//这里n2用来计算位置获取权值
			for (int k = 1; k <= l- i - 1; k++)
				n2 *= j;
			//这里区分数字和大写字母
			if (s.charAt(i) >= '0' && s.charAt(i) <= '9')
				n1 += n2 * (s.charAt(i) - '0');


### 给大家的福利


**零基础入门**


对于从来没有接触过网络安全的同学,我们帮你准备了详细的学习成长路线图。可以说是最科学最系统的学习路线,大家跟着这个大的方向学习准没问题。


![](https://img-blog.csdnimg.cn/img_convert/95608e9062782d28f4f04f821405d99a.png)


同时每个成长路线对应的板块都有配套的视频提供:


![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/a91b9e8100834e9291cfcf1695d8cd42.png#pic_center)

因篇幅有限,仅展示部分资料

**需要体系化学习资料的朋友,可以加我V获取:vip204888 (备注网络安全)**

**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**

**[需要这份系统化资料的朋友,可以点击这里获取](https://bbs.csdn.net/topics/618540462)**

**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**



因篇幅有限,仅展示部分资料

**需要体系化学习资料的朋友,可以加我V获取:vip204888 (备注网络安全)**

**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**

**[需要这份系统化资料的朋友,可以点击这里获取](https://bbs.csdn.net/topics/618540462)**

**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值