第八届蓝桥杯国赛Java b组 小计算器

12 篇文章 0 订阅
5 篇文章 0 订阅
package di8jie;

import java.util.Scanner;

public class xiaojisuanqi4 {
	/*
	 * 
	 * 标题:小计算器
	 * 
	 * 模拟程序型计算器,依次输入指令,可能包含的指令有
	 * 
	 * 1. 数字:'NUM X',X为一个只包含大写字母和数字的字符串,表示一个当前进制的数 2.
	 * 运算指令:'ADD','SUB','MUL','DIV','MOD',分别表示加减乘,除法取商,除法取余 3. 进制转换指令:'CHANGE
	 * K',将当前进制转换为K进制(2≤K≤36) 4. 输出指令:'EQUAL',以当前进制输出结果 5. 重置指令:'CLEAR',清除当前数字
	 * 
	 * 指令按照以下规则给出: 数字,运算指令不会连续给出,进制转换指令,输出指令,重置指令有可能连续给出
	 * 运算指令后出现的第一个数字,表示参与运算的数字。且在该运算指令和该数字中间不会出现运算指令和输出指令
	 * 重置指令后出现的第一个数字,表示基础值。且在重置指令和第一个数字中间不会出现运算指令和输出指令 进制转换指令可能出现在任何地方
	 * 
	 * 运算过程中中间变量均为非负整数,且小于2^63。 以大写的'A'~'Z'表示10~35
	 * 
	 * [输入格式] 第1行:1个n,表示指令数量 第2..n+1行:每行给出一条指令。指令序列一定以'CLEAR'作为开始,并且满足指令规则
	 * 
	 * [输出格式] 依次给出每一次'EQUAL'得到的结果
	 * 
	 * [样例输入] 7 CLEAR NUM 1024 CHANGE 2 ADD NUM 100000 CHANGE 8 EQUAL
	 * 
	 * [样例输出] 2040
	 * 
	 * 补充说明: 1. n 值范围: 1<= n < 50000 2. 初始默认的进制是十进制
	 * 
	 * 
	 * 
	 * 资源约定: 峰值内存消耗 < 256M CPU消耗 < 1000ms
	 * 
	 * 
	 * 请严格按要求输出,不要画蛇添足地打印类似:“请您输入...” 的多余内容。
	 * 
	 * 所有代码放在同一个源文件中,调试通过后,拷贝提交该源码。 注意:不要使用package语句。不要使用jdk1.7及以上版本的特性。
	 * 注意:主类的名字必须是:Main,否则按无效代码处理。
	 * 
	 */
	static long basis = 0;
	static int jinzhi = 10;
	static int yunsuan = 0;// ADD SUB MUL DIV MOD
						   // 1 2 3 4 5
					       // 加 减 乘 除法取商 除法取余
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner sc = new Scanner(System.in);
		int n = sc.nextInt();
		sc.nextLine();
		

		while (n > 0) {
			
			String str = sc.nextLine();
			
			if (str.equals("CLEAR")) {
				basis = 0;
//				jinzhi = 10;
//				yunsuan = 0;
				n--;
				continue;
			}

			if (str.equals("ADD")) {
				yunsuan = 1;
				n--;
				continue;
			}
			if (str.equals("SUB")) {
				yunsuan = 2;
				n--;
				continue;
			}
			if (str.equals("MUL")) {
				yunsuan = 3;
				n--;
				continue;
			}
			if (str.equals("DIV")) {
				yunsuan = 4;
				n--;
				continue;
			}
			if (str.equals("MOD")) {
				yunsuan = 5;
				n--;
				continue;
			}
			if (str.equals("EQUAL")) {
				
				System.out.println(re(basis,jinzhi));
				n--;
				continue;
			}

			if (str.split(" ")[0].equals("NUM")) {
				String x_in = str.split(" ")[1];
				long x = re(x_in, jinzhi);
				switch (yunsuan) {
				case 0:
					basis = x;
					break;

				case 1:
					basis += x;
					break;

				case 2:
					basis -= x;
					break;

				case 3:
					basis = basis * x;
					break;

				case 4:
					basis = basis / x;
					break;

				case 5:
					basis = basis % x;
					break;

				default:
					System.out.println("wrong");
					break;
				}
				n--;
				continue;

			}

			jinzhi = Integer.parseInt(str.split(" ")[1]);
			n--;
		}

	}

	public static long re(String v, int jinzhi) {
		char [] s =v.toCharArray();
		long aws = 0;
		for(int i=0;i<s.length;i++){
			if(s[s.length-i-1]-'A'>=0){
				int t = s[s.length-i-1]-'A'+10;
				aws = aws +((long)t) * (long)Math.pow(jinzhi, i);
			}else{
				int t = s[s.length-i-1]-'0';
				aws = aws +((long)t) * (long)Math.pow(jinzhi, i);
			}
		}
		return aws;
	}

	public static String re(long v,int jinzhi){
		if(v==0)return "";
		
		return re(v/jinzhi,jinzhi)+((v%jinzhi)>9?z[(int)((v%jinzhi)-10)]:v%jinzhi);
	}
	static String [] z ={"A","B","C","D","E","F","G","H","I","J","K","L",
				"M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z"};
	
}



 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值