蓝桥杯 历届试题 小计算器

本文介绍了如何实现一个模拟程序型计算器,遵循特定的指令规则,包括数字输入、运算指令、进制转换、输出和重置操作。样例展示了一组指令序列及其对应的输出结果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题描述
  模拟程序型计算器,依次输入指令,可能包含的指令有

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’表示1035
输入格式
  第1行:1个n,表示指令数量
  第2…n+1行:每行给出一条指令。指令序列一定以’CLEAR’作为开始,并且满足指令规则
输出格式
  依次给出每一次’EQUAL’得到的结果
样例输入
7
CLEAR
NUM 1024
CHANGE 2
ADD
NUM 100000
CHANGE 8
EQUAL
样例输出
2040

/* 1、这题可以将所有输入的数据都转化为十进制进行计算,
   再将最终输出的答案转化为题目所要求输出的进制即可 
   2、可以专门用一个数(例:k),记录题目现在要求转化为几进制 
   3、输出时如果答案是0要记得特判 
   4、只有输入NUM时接下来才会输入一个数进行运算,还有CHANGE后面会接K表示进制,其他指令后面没有接数字 
*/ 

#include<iostream>
#include<stdio.h>
#include<string.h>
#include<algorithm>

using namespace std;

int main()
{
	int k, i, j, n, y, flag = 0; //flag用来记录接下来会进行什么运算 
	string s1, s2;
	char a[100];  //记录输入的要进行计算的数字 
	long long  sum, x;
	scanf("%d", &n);
	k = 10;
	while(n--)
	{
		cin>>s1; //c++的string类方便进行比较 
		
		if(s1 == "CLEAR") //清除,进制不需要转化 
		{
			sum = 0;
			flag = 0;
		}
		else if(s1 == "CHANGE")
		{
			cin>>y;
			k = y;  //将进制转化为k进制 
		}
		else if(s1 == "EQUAL")
		{
			i = 0;
			if(sum == 0)  //等于0必须特判,否则只能过30%; 
			printf("0\n");
			else
			{
				long long sum2 = sum;  //sum在转化进制的过程中值会变化,所以先记录下来,方便还原值不影响接下来的计算 
				while(sum > 0)  //sum转化为k进制并存入数组a中 
				{
					a[i] = sum % k;
					sum /= k;
					i++;
				}
				for(j = i-1; j >= 0; j--)  //输出答案 
				{
					if(a[j] >= 10)
					printf("%c", 'A'+(a[j]-10));
					else
					printf("%d", a[j]); 
			   }
			
				sum = sum2; //还原sum 
				printf("\n");
			}
			
		}
		else if(s1 == "NUM")  
		{
			cin>>a;
			int h = strlen(a);
			long long num = 0;
			for(i = 0; i < h; i++) //将输入的数转化为十进制,方便计算 
			{
				int ans;
				if(a[i] >= 'A' && a[i] <= 'Z')  
				   ans = a[i] - 'A' + 10;
				else
				   ans = a[i] - '0';
				num = num * k + ans;
			}
			if(flag == 0) //等于0代表前面的数被清除,此时输入的数就是初始值 
			    sum = num;
			else if(flag == 1) //加 
			    sum += num;
			else if(flag == 2) //减 
			    sum -= num;
			else if(flag == 3) //乘 
			    sum *= num;
			else if(flag == 4) //除法取商 
			    sum /= num;
			else   //除法取模 
			    sum %= num;
			//cout<<sum<<" "<<num<<endl;
		}
		else if(s1 == "ADD")
		{
			flag = 1;
		}
		else if(s1 == "SUB")
		{
			flag = 2;
		}
		else if(s1 == "MUL")
		{
			flag = 3;
		}
		else if(s1 == "DIV")
		{
		    flag = 4;
		}
		else if(s1 == "MOD")
		{
			flag = 5;
		}
		
	}
	return 0;
}```

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值